LINQ kullanarak bir DataTable'dan farklı, sıralı bir ad listesi nasıl alabilirim?


104

Bir var DataTablebir ile Namesütunda. Alfabetik olarak sıralanan benzersiz adlardan oluşan bir koleksiyon oluşturmak istiyorum. Aşağıdaki sorgu, sıraya göre maddeyi yok sayar .

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

Neden orderbyuygulanmıyor?

Yanıtlar:


37

Daha okunabilir ve sürdürülebilir hale getirmek için, birden çok LINQ ifadesine de bölebilirsiniz.

  1. Öncelikle verilerinizi yeni bir listeye seçin, diyelim x1, istenirse projeksiyon yapın
  2. Ardından, istediğiniz ayrımı kullanarak x1içine doğru farklı bir liste oluşturunx2
  3. Son olarak, istediğiniz şeye göre sıralayarak , içinden x2içine sıralı bir liste oluşturunx3

55

Sorun, Distinct operatörünün, orijinal değer sırasını koruyacağını kabul etmemesidir.

Yani sorgunuzun şu şekilde çalışması gerekecek

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );

11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);

8

Aşağıdakileri deneyin:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);

3

Takip etmeyi dene

var names = (from dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy(name => name);

bu ihtiyacınız olan şey için çalışmalıdır.


2

Özetlemek gerekirse: tüm cevapların ortak bir yönü vardır.

OrderBy'nin son işlem olması gerekir.


2

Bunun gibi bir şey kullanabilirsiniz:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.