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?

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

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

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

8

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

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

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.


2

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

OrderBy musi być operacją końcową.


2

Możesz użyć czegoś takiego:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.