2009-04-09 9 views
7

मेरे पास दो विधियां हैं जो मूल रूप से अंतर्निहित चेकबॉक्स के टेक्स्ट या टैग को 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()); 
} 

उत्तर

22
public string GetAsCsv(Func<CheckBox, string> getValue) 
{ 
    var buffer = new StringBuilder(); 
    foreach (var cb in SelectedCheckBoxes) 
    { 
     buffer.Append(getValue(cb)).Append(","); 
    } 
    return DropLastComma(buffer.ToString()); 
} 
फिर

:

GetAsCsv(cb => cb.Tag != null ? cb.Tag.ToString() : string.Empty); 
GetAsCsv(cb => cb.Text); 
+0

मैं वास्तव में आपके समाधान के साथ-साथ जॉन का उपयोग कर रहा हूं। तय करना मुश्किल है ... – Sung

+0

w00t! कार्यात्मक प्रोग्रामिंग :) – Juliet

+0

@ प्रिंस: क्या यह एक कार्यात्मक प्रोग्रामिंग दृष्टिकोण है? मुझे इसके बारे में भी पता नहीं था ... – Sung

0

के बाद से दो कार्य वास्तव में कर रहे हैं एक ही गेटर के लिए को छोड़कर, वह यह है कि आप कहां से शुरू: चलती हिस्सा।

अभी तक धकेल दिया है नहीं मेरी सी #, लेकिन की तर्ज पर कुछ:

public string GetCsv(Func<string> getter) 
    { 
     var buffer = new StringBuilder(); 
     foreach (var cb in SelectedCheckBoxes) 
     { 
      buffer.Append(getter()).Append(","); 
     } 
     return DropLastComma(buffer.ToString()); 
    } 

काम करना चाहिए। इसके अलावा, SelectedCheckBoxes चर बनाओ?

+0

आप गलत प्रश्न पढ़ते हैं, चयनित चेकबॉक्स सबसे परिवर्तनीय है, सीबी पर उपयोग की जाने वाली संपत्ति चर है। – Samuel

19

मैं string.Join बजाय का उपयोग करेंगे:

string tags = string.Join(",", 
        SelectedCheckBoxes.Select(cb => Convert.ToString(cb.Tag)) 
            .ToArray()); 
string text = string.Join(",", 
        SelectedCheckBoxes.Select(cb => cb.Text).ToArray()); 

ज़रूर, तुम एक विधि में है कि डाल सकता है, लेकिन मैं शायद सिर्फ दो कॉल के लिए परेशान नहीं होता।

public string GetAsCsv(Func<CheckBox, string> getValue) 
{ 
    string[] array = SelectedCheckBoxes.Select(getValue).ToArray(); 
    return string.Join(",", array); 
} 
+0

बहुत अच्छी कमी। –

+0

वाह। अब यह मुझे पूरी तरह से "DropLastComma()" – Sung

+0

को हटाने की अनुमति देगा स्ट्रिंग नहीं है। एक स्ट्रिंग [] की उम्मीद करें? टैग के लिए यह कैसे काम करता है, जो एक वस्तु है? –

2

आप एक लैम्ब्डा इस्तेमाल कर सकते हैं:

public string ConvertToCSV(Func<CheckBox, string> cb_prop) { 
    ... 
    buffer.Append(cb_prop(cb)).Append(","); 
    ... 

} 

ConvertToCSV(c => c.Tag); 
1

मैं सिर्फ IEnumerable चारों ओर एक छोटी विस्तार विधि लिखते हैं

आप करना चाहते हैं तो हालांकि, यहां यह ब्रायन की टेम्पलेट का उपयोग कर यह कैसी दिखाई देगी स्ट्रिंग है कि एक विभाजक ले लिया:

public static string Join(this IEnumerable<string> strings, string separator) 
{ 
    return string.Join(separator, strings.ToArray()); 
} 

तो आप कर सकते हैं:

var text = SelectedCheckBoxes.Select(cb => cb.Text).Join(", "); 
var tags = SelectedCheckBoxes.Select(cb => (string)cb.Tag).Join(", "); 
संबंधित मुद्दे

 संबंधित मुद्दे