Wie erhalte ich mit LINQ eine eindeutige, geordnete Liste von Namen aus einer DataTable?

104

Ich habe eine DataTablemit einer NameSpalte. Ich möchte eine Sammlung der eindeutigen Namen erstellen, die alphabetisch sortiert sind. Die folgende Abfrage ignoriert die order by- Klausel.

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

Warum wird das orderbynicht durchgesetzt?

Bob
quelle

Antworten:

37

Um es lesbarer und wartbarer zu machen, können Sie es auch in mehrere LINQ-Anweisungen aufteilen.

  1. Wählen Sie zunächst Ihre Daten in einer neuen Liste aus, nennen wir sie x1 und führen bei Bedarf eine Projektion durch
  2. Erstellen Sie als Nächstes eine eindeutige Liste von x1bis x2mit der gewünschten Unterscheidung
  3. Erstellen Sie abschließend eine geordnete Liste von x2nach x3und sortieren Sie nach Ihren Wünschen
a7 zog
quelle
55

Das Problem ist, dass der Distinct-Operator nicht gewährt, dass die ursprüngliche Reihenfolge der Werte beibehalten wird.

Ihre Abfrage muss also so funktionieren

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Bob
quelle
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Peter Mortensen
quelle
8

Probieren Sie Folgendes aus:

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

Versuche Folgendes

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

Dies sollte für das funktionieren, was Sie brauchen.

Nick Berardi
quelle
2

Um es zu abstrahieren: Alle Antworten haben etwas gemeinsam.

OrderBy muss die letzte Operation sein.

Philip Raath
quelle
2

Sie können so etwas verwenden:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Presto
quelle