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?

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

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

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

8

Probieren Sie Folgendes aus:

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

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.


2

Um es zu abstrahieren: Alle Antworten haben etwas gemeinsam.

OrderBy muss die letzte Operation sein.


2

Sie können so etwas verwenden:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.