14 Stimmen

Wie funktioniert IOrderedEnumerable.ThenBy() in .Net?

Ich möchte verstehen, wie ThenBy in .Net funktioniert. (Ich weiß, wie man es benutzt, ich verstehe nur nicht, wie Microsoft es implementiert hat!)

In der Dokumentation heißt es dazu, string_list.OrderBy(Function (x) x.length).ThenBy(Function (x) x) sollte eine nach Länge geordnete Liste von Zeichenketten ausgeben und dann alphabetisch. Wie soll das funktionieren?!? Die erste Sortierung erfolgt nach Länge. Die zweite Sortierung sollte die Sortierung der ersten aufheben!

Nehmen Sie diesen Code an:

Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
sorted_by_length = sorted_by_length.ThenBy(Function

Hier versuche ich, die letzte Zeile zu implementieren, ohne ThenBy :

Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
'my implementation of OrderBy:
Dim e as IEnumerator(Of String) = sorted_by_length.GetEnumerator
Do While e.MoveNext
    'I have no idea what to write here!
Loop

Hier ist etwas Magie im Spiel... Gibt es eine Funktion e.GetPreviousKeySelector()? In der Tat kann ich nicht einmal eine Funktion schreiben, die IOrderedEnumerable zurückgibt!

17voto

Jon Skeet Punkte 1325502

Wie soll das funktionieren?!? Die erste Sortierung erfolgt nach Länge. Die zweite Sortierung sollte die Sortierung der ersten aufheben!

Nein, der zweite Sortiervergleich wird nur herangezogen, wenn der erste Vergleich zwei gleiche Werte findet.

En IOrderedEnumerable Implementierung tut dies, indem sie sich effektiv alle Vergleiche merkt - oder, wie man es anders ausdrücken könnte, indem sie es Ihnen ermöglicht, einen Vergleich aus "dem aktuellen Vergleich und einem anderen, der zu Rate gezogen wird, wenn dieser 0 ergibt", zu erstellen.

Ich habe eine Blogbeitragsreihe das sich eingehend mit LINQ to Objects befasst und eine vollständige alternative Implementierung bietet. Die Grundlage von IOrderedEnumerable ist abgedeckt in Teil 26a y 26b mit mehr Details und Optimierung in 26c y 26d .

Tatsächlich kann ich nicht einmal eine Funktion schreiben, die IOrderedEnumerable zurückgibt!

Das können Sie auf jeden Fall - entweder indem Sie den Wert zurückgeben, der von OrderBy oder indem Sie es selbst umsetzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X