Jak uzyskać odrębną, uporządkowaną listę nazw z DataTable przy użyciu LINQ?

104

Mam DataTablez Namekolumną. Chcę wygenerować kolekcję unikatowych nazw uporządkowanych alfabetycznie. Poniższe zapytanie ignoruje klauzulę order by .

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

Dlaczego orderbynie są egzekwowane?

Pion
źródło

Odpowiedzi:

37

Aby uczynić go bardziej czytelnym i łatwym w utrzymaniu, możesz również podzielić go na wiele instrukcji LINQ.

  1. Najpierw wybierz swoje dane na nową listę, nazwijmy to x1, zrób projekcję, jeśli chcesz
  2. Następnie utwórz odrębną listę od x1do x2, stosując dowolne rozróżnienie
  3. Na koniec utwórz uporządkowaną listę od x2do x3, sortuj według dowolnych potrzeb
a7drew
źródło
55

Problem polega na tym, że operator Distinct nie gwarantuje, że zachowa pierwotną kolejność wartości.

Twoje zapytanie musi więc działać w ten sposób

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Pion
źródło
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Peter Mortensen
źródło
8

Wypróbuj następujące rozwiązania:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Gavin Fang
źródło
3

Spróbuj wykonać następujące czynności

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

to powinno działać na to, czego potrzebujesz.

Nick Berardi
źródło
2

Abstrahując: wszystkie odpowiedzi mają coś wspólnego.

OrderBy musi być operacją końcową.

Philip Raath
źródło
2

Możesz użyć czegoś takiego:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Presto
źródło