Ich habe versucht, OrderBy
in einer LINQ-Anweisung zu bekommen, um mit einem anonymen Objekt zu arbeiten, aber jetzt ist es fehlgeschlagen.
Ich habe diese bereits überprüft:
Anonyme IComparer-Implementierung
C# linq sort - schnelle Möglichkeit, IComparer instanziieren
Wie man ein Array sortiert des Objekts durch ein bestimmtes Feld in C #?
Ich habe ein paar Stunden damit verbracht, verschiedene Ansätze auszuprobieren, aber da muss etwas fehlen, das ich vermisse.
Sagen wir, es gibt die folgende Klasse:
%Vor% Und products
ist eine Liste dieser Objekte.
Wie kann ich diese LINQ-Anweisung abschließen, sodass sie mit dem anonymen Objekt funktioniert?
Um es klar zu sagen, ich weiß, dass ich das auf eine andere Art und Weise tun kann, aber ich wäre sehr daran interessiert zu lernen, wie dieses bestimmte Beispiel funktioniert.
Es scheint, dass dies mit einer Implementierung von ProjectionComparer
möglich sein sollte:
Ссылка
Irgendwelche Ideen wie man das macht?
UPDATE:
Ich habe einen schnellen Leistungstest gemacht - die anonyme Vergleichslösung gegenüber der Standardbestellung durch. Dann scheint es, dass die anonyme Lösung ziemlich langsam ist, was wir wahrscheinlich sowieso erwartet hätten.
%Vor% Sie können eine IComparer<T>
-Implementierung erstellen, die einen Delegaten verwendet, den Sie für den Vergleich angeben, und ihn mit Typinferenz instanziieren (ähnlich wie bei "cast by example"):
Und benutze es so:
%Vor%BEARBEITEN: Ich habe gerade die Projektionsvergleichsseite ausgecheckt. Bei diesem Ansatz benötigen Sie das Argument "example" für die Typinferenz nicht. Der Ansatz muss jedoch angepasst werden, um statt einer Schnittstelle einen Delegaten zu verwenden. Hier ist es:
%Vor%Sie brauchen nicht wirklich ein anonymes Objekt, um diese Objekte durch Populariy absteigend zu sortieren und dann zu pricen, Sie können OrerBy und ThenBy in Kombination verwenden, wie:
%Vor% Um einen IComparer<T>
für einen anonymen Typ zu erstellen, verwenden Sie am besten eine Factory, um eine von einem Delegaten zu konstruieren und Typinferenz zu verwenden (die Angabe anonymer Typen ohne Schlussfolgerung ist ein Schmerz!).
Vielleicht möchten Sie die Auswirkungen auf die Leistung beim Erstellen anonymer Objekte rein für die Bestellung zu messen, aber Phoogs Antwort bietet eine gute Möglichkeit,% Co_de% Delegate verwenden, um eine Comparison<T>
im laufenden Betrieb zu erstellen ..
Nicht genau eine Antwort ... aber zu lang für einen Kommentar: Es ist schwierig, einen vernünftigen generischen Vergleich zu erstellen.
Während es eine gut etablierte Vergleichsbeziehung für Objekte durch einzelne Eigenschaft gibt, gibt es keine solche für mehrere oder sogar 2 Eigenschaften. I.e. Dies ist ein häufiges Problem, wenn Sie versuchen, Punkte auf einer flachen Oberfläche zu ordnen: nur 2 Werte (x, y), aber es gibt keine Möglichkeit zu sagen (x1, y1) & lt; (x2, y2), damit alle einverstanden sind.
In den meisten Fällen sagen Sie am Ende die Reihenfolge nach Attribut 1, dann nach Attribut 2, ... oder indem Sie alle Attribute auf einen einzelnen Wert abbilden (d. h. indem Sie einfach alle multiplizieren). Diese Ansätze lassen sich ohne LINQ:
ohne generischen Vergleicher leicht ausdrücken