मेरे पास दो विधियां हैं जो मूल रूप से अंतर्निहित चेकबॉक्स के टेक्स्ट या टैग को CSV स्ट्रिंग के रूप में परिवर्तित करती हैं।
क्या आप इन दो तरीकों से एक सामान्य कार्यक्षमता को दोबारा कर सकते हैं?
इन दो तरीकों
- GetSelectedTextAsCsv()
- GetTagAsCsv()
केवल जिसके द्वारा संपत्तिSelectedCheckBoxes
से मूल्य, प्रकार का है जो निकालने के लिए अलग IList<CheckBox>
public string GetSelectedTextAsCsv()
{
var buffer = new StringBuilder();
foreach (var cb in SelectedCheckBoxes)
{
buffer.Append(cb.Text).Append(",");
}
return DropLastComma(buffer.ToString());
}
public string GetTagAsCsv()
{
var buffer = new StringBuilder();
foreach (var cb in SelectedCheckBoxes)
{
buffer.Append(cb.Tag).Append(",");
}
return DropLastComma(buffer.ToString());
}
मैं एक ऐसी विधि निकालने का प्रयास कर रहा था जो Func<T, TResult>
देता है लेकिन यह सुनिश्चित नहीं करता कि मैं इसे कैसे खींच सकता हूं। मेरे गरीब प्रयास की तरह था, लेकिन मैं निम्नलिखित को समझ नहीं सकता के रूप में भीतर ConvertToCsv()
public Func<T, string> ConvertToCsv<T>()
{
return propertyName =>
{
var buffer = new StringBuilder();
foreach (var checkBox in SelectedCheckBoxes)
{
buffer.Append(
/* How can you abstract this portion? like following? */
checkBox.propertyName
).Append(",");
}
return DropLastComma(buffer.ToString());
};
}
टिप्पणी में दिखाया गया है अगर मैं एक गलत रास्ते पर हूँ कैसे संपत्ति भाग को निकालने के लिए, आप कृपया मुझे पर मैं कैसे कर सकते सलाह देंगे एक सामान्य विधि का उपयोग करने के लिए कोड के ऊपर रिफैक्टर?
[अद्यतन 1] यहाँ दोनों ब्रायन और जॉन की जवाब के संयोजन
public string ConvertToCsv<T>(Func<CheckBox, T> getValue)
{
var stringValues = SelectedCheckBoxes.Select(
cb => getValue(cb).ToString()).ToArray();
return string.Join(",", stringValues);
}
public string GetSelectedTextAsCsv()
{
return ConvertToCsv(cb => cb.Text);
}
public string GetTagAsCsv()
{
return ConvertToCsv(cb => cb.Tag);
}
[अद्यतन 2] संस्करण 2
public string GetAsCsv<T>(Func<CheckBox, T> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(
cb => getValue(cb).ToString()).ToArray());
}
public string GetSelectedTextAsCsv()
{
return GetAsCsv(cb => cb.Text);
}
public string GetTagAsCsv()
{
return GetAsCsv(cb =>
cb.Tag == null ? string.Empty : cb.Tag.ToString());
}
[अद्यतन 3] बनाया गया है चेकबॉक्स के बंद जेनेरिक के रूप में GetAsCsv()
का पैरामीटर और स्ट्रिंग
Func<CheckBox, T>
सेFunc<CheckBox, string>
।
इससे मुझे GetAsCsv()
को भी सरल और अधिक पठनीय बनाने की अनुमति मिली।
private string GetAsCsv(Func<CheckBox, string> getValue)
{
return string.Join(",", SelectedCheckBoxes.Select(getValue).ToArray());
}
मैं वास्तव में आपके समाधान के साथ-साथ जॉन का उपयोग कर रहा हूं। तय करना मुश्किल है ... – Sung
w00t! कार्यात्मक प्रोग्रामिंग :) – Juliet
@ प्रिंस: क्या यह एक कार्यात्मक प्रोग्रामिंग दृष्टिकोण है? मुझे इसके बारे में भी पता नहीं था ... – Sung