Sie sollten auf jeden Fall verwenden , ThenBy
anstatt mehrOrderBy
Anrufe.
Ich würde dies vorschlagen:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Beachten Sie, wie Sie jedes Mal denselben Namen verwenden können. Dies entspricht auch:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Wenn Sie OrderBy
mehrmals anrufen , wird die Sequenz effektiv dreimal vollständig neu angeordnet. Der letzte Anruf ist also effektiv der dominierende. Sie können (in LINQ to Objects) schreiben
foo.OrderBy(x).OrderBy(y).OrderBy(z)
das wäre gleichbedeutend mit
foo.OrderBy(z).ThenBy(y).ThenBy(x)
da die Sortierreihenfolge stabil ist, sollten Sie aber unbedingt nicht:
- Es ist schwer zu lesen
- Es funktioniert nicht gut (weil es die gesamte Sequenz neu ordnet)
- Es kann gut nicht funktioniert bei anderen Anbietern (z. B. LINQ to SQL).
- Es ist im Grunde nicht so, wie
OrderBy
es verwendet werden soll.
Es OrderBy
geht darum, die "wichtigste" Ordnungsprojektion bereitzustellen. dann benutzeThenBy
(wiederholt), um sekundäre, tertiäre usw. Projektionen anzugeben.
Stellen Sie sich das effektiv so vor: OrderBy(...).ThenBy(...).ThenBy(...)
Sie können einen einzelnen zusammengesetzten Vergleich für zwei beliebige Objekte erstellen und die Sequenz dann einmal mit diesem zusammengesetzten Vergleich sortieren . Das ist mit ziemlicher Sicherheit das, was Sie wollen.