Come posso ottenere un elenco di nomi distinto e ordinato da un DataTable utilizzando LINQ?


104

Ho una DataTablecon una Namecolonna. Desidero generare una raccolta dei nomi univoci ordinati alfabeticamente. La seguente query ignora la clausola order by .

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

Perché il orderbynon viene applicato?

Risposte:


37

Per renderlo più leggibile e gestibile, è anche possibile suddividerlo in più istruzioni LINQ.

  1. Innanzitutto, seleziona i tuoi dati in un nuovo elenco, chiamiamolo x1 , fai una proiezione se lo desideri
  2. Successivamente, crea un elenco distinto, da x1in x2, utilizzando la distinzione richiesta
  3. Infine, crea un elenco ordinato, da x2in x3, ordinandolo in base a ciò che desideri

55

Il problema è che l'operatore Distinct non garantisce che manterrà l'ordine dei valori originale.

Quindi la tua query dovrà funzionare in questo modo

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

Prova quanto segue:

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

3

Prova quanto segue

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

questo dovrebbe funzionare per quello che ti serve.


2

Astrarre: tutte le risposte hanno qualcosa in comune.

OrderBy deve essere l'operazione finale.


2

Puoi usare qualcosa del genere:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.