2014-09-15 8 views
5

मान लीजिए मैं एक सीएसवी करने के लिए एक T[,] से कुछ डेटा डंप के लिए एक विस्तार विधि लिखना चाहते हैं:लैम्ब्डा सी # विस्तार विधि में

public static void WriteCSVData<T>(this T[,] data, StreamWriter sw) 
{ 
    for (int row = 0; row < data.GetLength(0); row++) 
     for (int col = 0; col < data.GetLength(1); col++) 
     { 
      string s = data[row, col].ToString(); 

      if (s.Contains(",")) 
       sw.Write("\"" + s + "\""); 
      else 
       sw.Write(s); 

      if (col < data.GetLength(1) - 1) 
       sw.Write(","); 
      else 
       sw.WriteLine(); 
     } 
} 

जो मैं

using (StreamWriter sw = new StreamWriter("data.csv")) 
    myData.WriteCSVData(sw); 

साथ कह सकते हैं लेकिन लगता है myData है एक Complex[,] और मैं जटिल संख्या की परिमाण लिखना चाहता हूं, पूर्ण मूल्य नहीं। यह सुविधाजनक हो अगर मैं लिख सकता है जाएगा:

using (StreamWriter sw = new StreamWriter("data.csv")) 
    myData.WriteCSVData(sw, d => d.Magnitude); 

लेकिन मुझे यकीन है कि लागू करने के लिए कैसे है कि विस्तार विधि में नहीं कर रहा हूँ या अगर यह भी संभव है।

+0

अपने आउटपुट फ़ील्ड में किसी भी उद्धरण या न्यूलाइन को उद्धृत करना न भूलें! – Gabe

उत्तर

8

आप इस तरह अपने मौजूदा विधि की एक अधिभार लिख सकते हैं:

public static void WriteCSVData<T, TValue>(this T[,] data, StreamWriter sw, 
    Func<T,TValue> func) 
{ 
    for (int row = 0; row < data.GetLength(0); row++) 
     for (int col = 0; col < data.GetLength(1); col++) 
     { 
      string s = func(data[row, col]).ToString(); 

      if (s.Contains(",")) 
       sw.Write("\"" + s + "\""); 
      else 
       sw.Write(s); 

      if (col < data.GetLength(1) - 1) 
       sw.Write(","); 
      else 
       sw.WriteLine(); 
     } 
} 

और जिस तरह से आप चाहते थे का उपयोग करें:

using (StreamWriter sw = new StreamWriter("data.csv")) 
    myData.WriteCSVData(sw, d => d.Magnitude); 
+2

धन्यवाद, यह वही है जो मुझे चाहिए! – Ozzah

+0

-1, आपका 'फॉर लूप संस्करण प्रत्येक पंक्ति के लिए एक नई पंक्ति उत्पन्न करता है, जबकि आपका LINQ संस्करण प्रत्येक तत्व के लिए एक नई पंक्ति उत्पन्न करता है। – Gabe

+0

@Gabe आप सही हैं। मैंने अनदेखा किया होगा कि यह केवल पंक्ति के अंतिम तत्व के लिए एक नई पंक्ति लिखता है। हटा दिया। –

1

पैरामीटर प्रकार टी साथ एक प्रतिनिधि परिभाषित करें और वापस जाने के प्रकार स्ट्रिंग। प्रतिनिधि टाइप करने के साथ लिखें WriteVVata विधि में पैरामीटर जोड़ें।

delegate string ExtractValueDelegate<T>(T obj); 

public static void WriteCSVData<T>(this T[,] data,ExtractValueDelegte<T> extractor , StreamWriter sw) { ... } 

// calling the method 
myData.WriteCSVData(sw, d => d.Magnitude.ToString()); 
+5

अब "मैनुअल प्रतिनिधि" की कोई आवश्यकता नहीं है। .NET ने उन्हें अभी बनाया है - इस मामले में 'Func ' ... – ChrFin

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