Jak mogę uzyskać wyraźny, uporządkowaną listę nazwisk z DataTable przy użyciu LINQ?

głosy
83

Mam DataTablez Namekolumny. Chcę, aby wygenerować zbiór unikatowych nazw uporządkowane alfabetycznie. Następujące kwerendy ignoruje kolejności przez klauzuli.

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

Dlaczego orderbynie dać egzekwowane?

Utwórz 01/08/2008 o 14:14
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
51

Problemem jest to, że operator Wyraźne nie zapewnia, że ​​pozostanie w pierwotnej kolejności wartości.

Więc zapytanie będzie musiał pracować tak

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Odpowiedział 01/08/2008 o 14:18
źródło użytkownik

głosy
1

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ć przez co trzeba.

Odpowiedział 07/08/2008 o 03:35
źródło użytkownik

głosy
30

Aby uczynić go bardziej czytelnym i utrzymaniu, można również podzielić ją na wiele sprawozdań LINQ.

  1. Najpierw należy wybrać dane do nowej listy, nazwijmy to x1, czy występ w razie potrzeby
  2. Następnie należy utworzyć odrębną listę od x1do x2, używając cokolwiek rozróżnienia wymagają
  3. Wreszcie utworzyć listę uporządkowaną, ze x2do x3sortowania przez co chcecie
Odpowiedział 04/09/2008 o 03:57
źródło użytkownik

głosy
8
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Odpowiedział 05/12/2008 o 02:08
źródło użytkownik

głosy
5

Wypróbuj następujące:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Odpowiedział 28/04/2013 o 10:27
źródło użytkownik

głosy
0

Do streszczenia: wszystkie odpowiedzi mają coś wspólnego.

OrderBy musi być ostateczna operacja.

Odpowiedział 30/01/2018 o 16:19
źródło użytkownik

głosy
0

Można użyć coś takiego:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Odpowiedział 25/06/2018 o 10:56
źródło użytkownik

głosy
0
dataTable.Rows.Cast<DataRow>().GrpBy(g => g["Name"]).Select(s => s.First()).OrBy(o => o["Name"]);
Odpowiedział 30/09/2019 o 11:48
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more