Ich habe versucht, OrderBy
in einer LINQ-Anweisung mit einem anonymen Objekt zu arbeiten, aber jetzt fehlgeschlagen.LINQ OrderBy anonymes Objekt mit Projektionsvergleich
checkte ich diese schon:
Anonymous IComparer implementation
C# linq sort - quick way of instantiating IComparer
How to sort an array of object by a specific field in C#?
verbrachte ich ein paar Stunden verschiedene Ansätze versucht, aber es hat etwas, was ich zu fehlen.
Lasst uns sagen, dass es die folgende Klasse:
public class Product
{
public int Id {get; set;}
public string Name {get; set;}
public int Popularity {get; set;}
public decimal Price {get; set;}
}
Und products
ist eine Liste dieser Objekte.
Wie kann ich diese LINQ-Anweisung abschließen, so dass sie mit dem anonymen Objekt funktioniert?
Um klar zu sein, ich weiß, dass ich das auf eine andere Art und Weise tun kann, aber ich wäre sehr interessiert zu lernen, wie dieses spezielle Beispiel funktioniert.
var sortedProducts = products
.OrderBy(p =>
new {p.Popularity, p.Price},
[IComparer magic goes here]);
Es scheint, dass es mit einer Implementierung der ProjectionComparer
möglich sein sollte:
http://code.google.com/p/edulinq/source/browse/src/Edulinq/ProjectionComparer.cs?r=0c583631b709679831c99df2646fc9adb781b2be
Irgendwelche Ideen, wie dies zu tun?
UPDATE:
habe ich einen schnellen Performance-Test auf diese - die anonyme comparer Lösung vs Standard orderby.thenby und es scheint, dass die anonyme Lösung ziemlich langsamer ist was wahrscheinlich ist, was wir vielleicht ohnehin erwartet.
numProd | Anon | chained orderby clauses
10 000 | 47 ms | 31 ms
100 000 | 468 ms | 234 ms
1 000 000| 5818 ms | 2387 ms
5 000 000| 29547 ms| 12105 ms
was sind Ihre Bestellkriterien? Wollen Sie sagen, dass es zuerst nach Popularität und dann nach Preis sein sollte? Warum nicht OrderBy auf Popularität und dann ThenBy auf Preis? –
@JamesMichaelHare - sagen wir höhere Popularität als primärer Faktor, niedrigerer Preis als sekundärer Faktor, wenn das für das Beispiel einen Unterschied macht. EDIT: Ich weiß, ich kann das tun, aber ich frage mich, ob die Annäherung mit dem anonymen Objekt überhaupt funktioniert, und wenn ja, kann ich einfach nicht herausfinden, wie. –
Warum überhaupt ein anonymes Objekt in OrderBy() verwenden? Warum nicht einfach: 'products.OrderByDescending (p => p.Popularity) .ThenBy (p => p.Price)' –