2013-07-04 11 views
15

22 sütunlu bir DataTable var ve sahip olduğum sütunlardan biri "id" olarak adlandırıldı. Bu sütunu sorgulamak ve tüm farklı değerleri bir listede tutmak istiyorum. Tablo 10 ila bir milyon sıra arasında olabilir.Büyük bir DataTable sütunundan farklı değerler seçin

Bunu yapmanın en iyi yolu nedir? Şu anda sütun için gitmek ve değerleri karşılaştırmak için bir for döngüsü kullanıyorum ve değerler aynı ise, o zaman bir sonraki gider ve aynı değil, bu diziye diziyi ekler. Ama masa 10 milyondan fazla satıra sahip olabileceğinden, bunu yapmanın daha verimli bir yolu var! Bunu daha verimli yapmak için nasıl giderim?

+0

'Linq' – Amit

+0

almak istiyor musunuz ayrı id en –

+0

Yani, bir' DataTable' veya veritabanı tablosundaki 10 milyon satır tutuyor? –

cevap

33

Yöntem 1:

DataView view = new DataView(table); 
    DataTable distinctValues = view.ToTable(true, "id"); 

Yöntem 2: Sen Datatable sütun adlarını eşleşen bir sınıf oluşturmak zorunda kalacak ve sonra Listeye Datatable dönüştürmek için aşağıdaki uzatma yöntemi kullanabilirsiniz

public static List<T> ToList<T>(this DataTable table) where T : new() 
    { 
     List<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 
     List<T> result = new List<T>(); 

     foreach (var row in table.Rows) 
     { 
      var item = CreateItemFromRow<T>((DataRow)row, properties); 
      result.Add(item); 
     } 

     return result; 
    } 

    private static T CreateItemFromRow<T>(DataRow row, List<PropertyInfo> properties) where T : new() 
    { 
     T item = new T(); 
     foreach (var property in properties) 
     { 
      if (row.Table.Columns.Contains(property.Name)) 
      { 
       if (row[property.Name] != DBNull.Value) 
        property.SetValue(item, row[property.Name], null); 
      } 
     } 
     return item; 
    } 

ve ardından, listeden farklı olarak

 YourList.Select(x => x.Id).Distinct(); 

Lütfen bunun sadece Kayıtları değil, yalnızca Kayıtları tamamladığını unutmayın.

17

Bu size farklı kimlikleri

var distinctIds = datatable.AsEnumerable() 
        .Select(s=> new { 
         id = s.Field<string>("id"),       
        }) 
        .Distinct().ToList(); 
7

dt retrun olacak -

ColumnName veri tablo adı -

DataView view = new DataView(dt); 
DataTable distinctValues = new DataTable(); 
distinctValues = view.ToTable(true, ColumnName); 
+0

bu, farklı değerlere indirgeniyor - kodunuzdaki hangi yöntemin, farklı azaltmadan sorumlu olduğu? – whytheq

+0

view.ToTable yöntemi, ilk parametrenin true olarak ayarlanması, tüm farklı değerleri alır. – Veer

+0

çok güzel - Bunu kullandım. yayınladı. – whytheq

2

bu deneyin sizin columnname yani id:

var idColumn="id"; 
var list = dt.DefaultView 
    .ToTable(true, idColumn) 
    .Rows 
    .Cast<DataRow>() 
    .Select(row => row[idColumn]) 
    .ToList(); 
+0

iyi biri! çok teşekkürler –

1

Çok eski iplikler için cevap yazdığım için üzgünüz. cevabım gelecekte başka yardımcı olabilir.

string[] TobeDistinct = {"Name","City","State"}; 
DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct); 

    //Following function will return Distinct records for Name, City and State column. 
    public static DataTable GetDistinctRecords(DataTable dt, string[] Columns) 
     { 
      DataTable dtUniqRecords = new DataTable(); 
      dtUniqRecords = dt.DefaultView.ToTable(true, Columns); 
      return dtUniqRecords; 
     } 
kullanabilirsiniz