2014-09-15 33 views
5

Bir CSV bir T[,] bazı verileri dökümü bir uzantısı yöntemi yazmak istiyorum varsayalım:Lambda C# uzantısı yönteminde

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(); 
     } 
} 

ki ben

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

ile diyebiliriz ama varsayalım myData olduğunu Bir Complex[,] ve ben tam değerin değil karmaşık sayıların büyüklüğünü yazmak istiyorum.

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

ama uzatma yönteminde olduğu nasıl uygulanacağı emin değilim ya da hatta mümkünse: Ne yazabilirim eğer kullanışlı olurdu.

+0

Çıktı alanlarınızda herhangi bir tırnak veya satır sonu teklifi yazmayı unutmayın! – Gabe

cevap

8

Böyle mevcut yöntemin bir aşırı yazabilirsiniz:

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(); 
     } 
} 

ve bir daha istediği şekilde kullanın:

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

Teşekkürler, tam ihtiyacım olan şey bu! – Ozzah

+0

-1, 'for' döngü sürümü her satır için yeni bir satır oluşturur, LINQ sürümünüz her öğe için yeni bir satır oluşturur. – Gabe

+0

@Gabe haklısınız. Bir satırın son elemanı için sadece yeni bir satır yazdığını göz ardı etmiş olmalıyım. çıkarıldı. –

1

parametre türü T bir temsilci tanımlamak ve türünü döndürür dize. Delegeyi yazmak için WriteCSVData yöntemine bir parametre ekleyin.

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

Artık "manuel delegeler" gerekmiyor. .NET, şu anda yerleşik olarak var - Bu durumda Func '... – ChrFin