TOC

This article has been localized into German by the community.

LINQ:

Sortieren von Daten: die Methoden OrderBy() und ThenBy()

Nachdem wir nun im vorherigen Artikel erfahren haben, wie Daten mit LINQ aus der Datenquelle abgerufen und mit der Methode Where() gefiltert werden, könnte der nächste Schritt darin bestehen, die Daten zu sortieren. Wir haben Listen von Objekten verwendet, entweder numerisch oder basierend auf z.B.: eine Benutzerklasse, also war die Reihenfolge, in der wir die Elemente erhielten, die gleiche Reihenfolge, in der sie der Liste hinzugefügt wurden. Wie bereits erwähnt, könnte Ihre Datenquelle für LINQ-Vorgänge jedoch auch ein XML-Dokument oder eine Datenbank sein. Daher ist die Fähigkeit, die Daten richtig zu sortieren, sobald wir die Daten haben, die wir brauchen, entscheidend. Zu unserem Glück hat LINQ mehrere einfach zu verwendende Methoden zum Sortieren von Daten - zunächst ein einfaches Beispiel:

List<int> numbers = new List<int>()
{
    1, 7, 2, 61, 14
};
List<int> sortedNumbers = numbers.OrderBy(number => number).ToList();
foreach (int number in sortedNumbers)
    Console.WriteLine(number);

Das war einfach, oder? Rufen Sie einfach die Methode OrderBy() auf und geben Sie das Objekt oder das Element des Objekts an, nach dem sortiert werden soll, und es wird eine sortierte Liste zurückgegeben. Und natürlich können Sie es mit Strings genauso einfach machen, wie wir im nächsten Beispiel sehen werden, aber lassen Sie uns die Elemente in absteigender Reihenfolge (von der größten zur kleinsten / von Z bis A) sortieren:

List<string> cityNames = new List<string>()
{
    "Amsterdam", "Berlin", "London", "New York"
};
List<string> sortedCityNames = cityNames.OrderByDescending(city => city).ToList();
foreach (string cityName in sortedCityNames)
    Console.WriteLine(cityName);

Wir machen dasselbe wie vorher, außer dass wir die Methode OrderByDescending() anstelle der OrderBy() -Methode verwenden. Aber natürlich können Sie Ihre Liste der ganzen Zahlen und Strings leicht sortieren lassen - das ist ein Kinderspiel! Dank LINQ ist es jedoch genauso einfach, komplexere Objekte zu sortieren. Hier ist ein Beispiel:

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqOrder2
{
    class Program
    {
static void Main(string[] args)
{
    List<User> listOfUsers = new List<User>()
    {
new User() { Name = "John Doe", Mail = "john@doe.com", Age = 42 },
new User() { Name = "Jane Doe", Mail = "jane@doe.com", Age = 34 },
new User() { Name = "Joe Doe", Mail = "joe@doe.com", Age = 8 },
new User() { Name = "Another Doe", Mail = "another@doe.com", Age = 15 },
    };

    List<User> usersByAge = listOfUsers.OrderBy(user => user.Age).ToList();
    foreach (User user in usersByAge)
Console.WriteLine(user.Name + ": " + user.Age + " years");
}

class User
{
    public string Name { get; set; }
    public string Mail { get; set; }
    public int Age { get; set; }
}
    }
}

Dies ist natürlich ein vollständigeres Beispiel mit der Benutzerklasse und der Liste der initialisierten Benutzer, aber wie Sie sehen, ist die tatsächliche Sortierung immer noch sehr kurz und präzise: Wenn wir die OrderBy() -Methode aufrufen, geben wir nur noch ein Parametername an und verwenden dann diesen Parameter, um auf die Age-Eigenschaft der Benutzerobjekte zuzugreifen. Das Ergebnis ist eine vollkommen altersgerechte Liste! Aber was, wenn wir nach mehr als einem Property sortieren möchten?

ThenBy() undThenByDescending() -Methoden

Im obigen Beispiel haben wir die Liste der Benutzer nach ihrem Alter sortiert, aber was wäre, wenn es mehrere Benutzer desselben Alters gäbe? Ein ziemlich häufiges Szenario, sogar in unserem kleinen Beispiel - stellen Sie sich vor, dass Jane und John gleich alt sind und ihre Kinder Zwillinge sind. In diesem Fall wäre es praktisch, die Reihenfolge zu steuern, selbst nachdem die Datenquelle nach dem Alter angeordnet wurde. Dafür können wir die Methoden ThenBy() und ThenByDescending() verwenden. Sie tun genau das, was der Name angibt: Kontrolliere die Reihenfolge nach der anfänglichen Sortierung. Damit können wir die Liste der Benutzer sortiert nach Alter und alphabetisch nach Namen sortieren:

List<User> listOfUsers = new List<User>()
{
    new User() { Name = "John Doe", Mail = "john@doe.com", Age = 42 },
    new User() { Name = "Jane Doe", Mail = "jane@doe.com", Age = 42 },
    new User() { Name = "Joe Doe", Mail = "joe@doe.com", Age = 8 },
    new User() { Name = "Jenna Doe", Mail = "another@doe.com", Age = 8 },      
};

List<User> sortedUsers = listOfUsers.OrderBy(user => user.Age).ThenBy(user => user.Name).ToList();
foreach (User user in sortedUsers)
    Console.WriteLine(user.Name + ": " + user.Age + " years");

Ganz einfach aber sehr effektiv! Sie können sogar mehrere ThenBy() - Methodenaufrufe verketten, falls Ihre Daten komplexer sind als die Daten aus unserem Testfall. Und natürlich können Sie die Methoden OrderBy(), OrderByDescending(), ThenBy() und ThenByDescending() beliebig miteinander kombinieren:

List<User> sortedUsers = listOfUsers.OrderBy(user => user.Age).ThenByDescending(user => user.Name).ToList();
foreach (User user in sortedUsers)  
    Console.WriteLine(user.Name + ": " + user.Age + " years");

Wir verwenden in diesem Tutorial hauptsächlich die methodenbasierte Syntax von LINQ, aber wie immer nehme ich eines der Beispiele in dem Artikel und zeige Ihnen, wie es mit der Abfragesyntax aussehen würde - hier ist das neueste Beispiel, einschließlich einer LINQ-Abfragesyntax Version:

// Method syntax
List<User> sortedUsers = listOfUsers.OrderBy(user => user.Age).ThenByDescending(user => user.Name).ToList();

// Query syntax
List<User> sortedUsersQ = (from user in listOfUsers orderby user.Age ascending, user.Name descending select user).ToList();

Wie Sie sehen können, ist die Syntax etwas anders - die Richtung (aufsteigend oder absteigend) wird direkt nach dem Feld angegeben, nach dem sortiert werden soll (aufsteigend ist eigentlich implizit, aber ich habe es eingefügt, um Ihnen den Unterschied zu zeigen). Außerdem gibt es kein "ThenBy" - stattdessen trennen Sie einfach mehrere Sortieranweisungen mit einem Komma. Am Ende liefern beide Abfragen natürlich dasselbe Ergebnis.

Zusammenfassung

Mit den Methoden OrderBy() und ThenBy() (sowie deren "absteigenden" Gegenstücken) können Sie Ihre Daten ganz einfach so sortieren, wie Sie es möchten. Und denken Sie daran, wie bei jeder anderen LINQ-Methode auch, dass die eigentliche Datenquelle nicht manipuliert wird - stattdessen erhalten Sie eine sortierte Kopie der ursprünglichen Datenquelle, mit der Sie arbeiten können.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!