2010-02-05 16 views
6

List<T> parametresinin columnValues parametresi için iletilebileceği şekilde, aşağıdaki yöntemi daha genel bir şekilde yapmaya çalışan bir beyin osuruğu yaşıyorum.Bu uzantı yöntemini nasıl daha genel yapabilirim?

public static DataRow NewRow(this DataTable dataTable, List<string> columnValues) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.ToArray(); 
    return returnValue; 
} 

Ben yöntemine geçirmeden önce orijinal listeyi bir List<object> olarak değiştirin ve dönüştürmek olabilir ama ben

Düzenleme :-) daha iyi bir seçenek olduğuna eminim: İşte ne var :

Frank'in gönderisi bunu tekrar düşünmemi sağladı. Çoğu durumda, List<T> kaynağı, List<object> olacaktır, çünkü sütun değerleri büyük olasılıkla farklı türlerdir.

İlk kullanımım için List<string> anlamlıdır, çünkü bu noktada tüm metin olan bir CSV ayrıştırmasından veri kümesi oluşturuyordum.

cevap

4

ile bağlantılı olarak

IEnumerable<object> 

hakkında, bu sonuçta yapabilirsiniz vardır sadece nesne listesinde geçer. Listenin genel bir parametresini girerseniz listenin tüm öğelerinin bu türden olması gerekirdi; bu da yararlı olma ihtimali düşüktür. dönüştürmek yardımıyla

table.NewRow(new { A = "Hello", B = 1, C = DateTime.Now }) 

:

sayısız sütun, farklı türde tüm almak için, size bir anonim tür örneğini içine bir nesne kabul edecek uzantısı yöntemini değiştirebilir, söyledikten Bir dizgeye anonim tip değerleri, by reflection or by a dynamic method nesne sözlüğü oldukça yararlı bir şey olmalıdır.

+0

Lol noktanız çok iyi ve bunu düşünmemiştim. İlk kullanımım için bir Liste anlamlıdır, çünkü bu noktada tüm metin olan bir CSV ayrıştırmasından veri kümesi oluşturuyordum. Diğer birçok kullanım için, bu, sütun değerleri büyük olasılıkla farklı türler olacağından anlam ifade etmez. –

2

Ne DataRow Öğe Dizisi nesneler dizisi olduğu için, temelde şans bitti

columnValues.Select(x => x.ToString()).ToArray(); 
5

Neden sadece aynen bu şekilde diyebilirsin Sonra params object[]:

public static DataRow NewRow(this DataTable dataTable, params object[] objects) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (objects.Length > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = objects; 
    return returnValue; 
} 

kullanın:

myDataTable.NewRow(1,2,"hello"); 
1

Ya giriş tipi

dayalı ItemArray oluşturmak için nasıl belirtmek için bir kapak yardımıyla yaklaşık
public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray(); 
    return returnValue; 
} 
İlgili konular