Ich habe den Namen der "nach Eigenschaft sortieren" in einer Zeichenfolge. Ich muss Lambda / Linq verwenden, um die Liste der Objekte zu sortieren.
Ex:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
- Anstatt eine Reihe von Wenns zum Überprüfen des Feldnamens (sortBy) zu verwenden, gibt es eine sauberere Methode zum Sortieren
- Ist sort der Datentyp bekannt?
c#
linq
lambda
linq-to-objects
DotnetDude
quelle
quelle
==
... was?Antworten:
Dies kann als erfolgen
Das .NET Framework gießt das Lambda
(emp1,emp2)=>int
alsComparer<Employee>.
Dies hat den Vorteil, stark typisiert zu sein.
quelle
list.sort(functionDeclaredElsewhere)
Eine Sache, die Sie tun könnten, ist zu ändern,
Sort
damit Lambdas besser genutzt werden.Jetzt können Sie das Feld angeben, das beim Aufrufen der
Sort
Methode sortiert werden soll.quelle
Sie können Reflection verwenden, um den Wert der Eigenschaft abzurufen.
Wobei TypeHelper eine statische Methode hat wie:
Möglicherweise möchten Sie auch Dynamic LINQ aus der VS2008-Beispielbibliothek anzeigen . Sie können die IEnumerable-Erweiterung verwenden, um die Liste als IQueryable umzuwandeln, und dann die OrderBy-Erweiterung für dynamische Links verwenden.
quelle
collection.ToList().OrderBy(x => TypeHelper.GetPropertyValue( x, sortBy)).ToList();
So habe ich mein Problem gelöst:
quelle
Das Erstellen der Reihenfolge durch Ausdruck kann hier gelesen werden
Schamlos von der Seite im Link gestohlen:
quelle
Sie können Reflection verwenden, um auf die Eigenschaft zuzugreifen.
Anmerkungen
quelle
Sort verwendet die IComparable-Schnittstelle, sofern der Typ dies implementiert. Und Sie können das Wenn vermeiden, indem Sie einen benutzerdefinierten IComparer implementieren:
und dann
quelle
Antwort für 1.:
Sie sollten in der Lage sein, manuell einen Ausdrucksbaum zu erstellen, der unter Verwendung des Namens als Zeichenfolge an OrderBy übergeben werden kann. Oder Sie können die Reflexion verwenden, wie in einer anderen Antwort vorgeschlagen, was möglicherweise weniger Arbeit bedeutet.
Bearbeiten : Hier ist ein funktionierendes Beispiel für das manuelle Erstellen eines Ausdrucksbaums. (Sortieren nach X.Wert, wenn nur der Name "Wert" der Eigenschaft bekannt ist). Sie könnten (sollten) eine generische Methode dafür erstellen.
Um einen Ausdrucksbaum zu erstellen, müssen Sie jedoch die teilnehmenden Typen kennen. Dies kann in Ihrem Nutzungsszenario ein Problem sein oder auch nicht. Wenn Sie nicht wissen, nach welchem Typ Sie sortieren sollen, ist die Verwendung von Reflektion wahrscheinlich einfacher.
Antwort für 2.:
Ja, da Comparer <T> .Default für den Vergleich verwendet wird, wenn Sie den Comparer nicht explizit definieren.
quelle
Eine andere, diesmal für jeden IQueryable:
Sie können mehrere Sortierkriterien wie folgt übergeben:
quelle
Die von Rashack bereitgestellte Lösung funktioniert leider nicht für Werttypen (int, enums usw.).
Damit es mit jeder Art von Eigenschaft funktioniert, habe ich folgende Lösung gefunden:
quelle
Hinzufügen zu dem, was @Samuel und @bluish getan haben. Dies ist viel kürzer, da die Aufzählung in diesem Fall nicht erforderlich war. Als zusätzlichen Bonus, wenn der Aufstieg das gewünschte Ergebnis ist, können Sie nur 2 Parameter anstelle von 3 übergeben, da true die Standardantwort auf den dritten Parameter ist.
quelle
Wenn Sie den Namen und die Sortierrichtung der Sortierspalte als Zeichenfolge erhalten und den Schalter nicht verwenden möchten oder die Syntax \ else zur Bestimmung der Spalte verwenden möchten, ist dieses Beispiel möglicherweise für Sie interessant:
Lösung basierend auf der Verwendung eines Wörterbuchs, das die für die Sortierspalte erforderliche Verbindung über Ausdruck> und dessen Schlüsselzeichenfolge herstellt.
quelle