Ich habe derzeit Probleme, einen Weg zu finden, eine IOrderedEnumerable von einer SortedList zu erhalten.Convert SortedList in IOrderedEnumerable
Ich habe einen komplexen Typ, wir werden es jetzt nur 'A' nennen, das kann in eine Aufzählung vom Typ 'A' zerlegt werden. Ich bin derzeit einen SortedList in einer rekursiven Zerlegung Funktion schaffen, in dem der Schlüssel, ein int
, auf die auftragsbezogene wird das Stück in zerlegt wurde: Jedoch
private static SortedList<int, A> RecursivelyBuildMySortedList(A myValue)
{
if (myValue == StopCondition())
{
return new SortedList<int, A> { { 1, myValue } };
}
var left = RecursivelyBuildMySortedList(myValue.Left);
var right = RecursivelyBuildMySortedList(myValue.Right).Select(entry => new KeyValuePair<int, A>(entry.Key + left.Count, entry.Value)).ToList();
right.ForEach(pair => left.Add(pair.Key, pair.Value));
return left;
}
, ich will nicht den SortedList für die Verbraucher belichten da der Wert des Schlüssels, der sich auf die Zerlegungsreihenfolge bezieht, für Verbraucher wenig Bedeutung hat (insbesondere als int
). Das einzige, worüber sich ein Verbraucher kümmern muss, ist die endgültige Bestellung der Stücke, so dass jedes Stück in der richtigen Reihenfolge verarbeitet werden kann. Ich würde es vorziehen, den Verbrauchern ein IteredEnumerable zugänglich zu machen. Ich dachte, das eine ziemlich einfache Aufgabe sein würde, da ein SortedList in vielerlei Hinsicht sehr ähnlich einen OrderedEnumerable ist, aber ich habe noch nicht eine gute Umwandlung finden kann:
public static IOrderedEnumerable<A> Decompose(A myValue)
{
SortedList<int, A> mySortedList = RecursivelyBuildMySortedList(myValue);
// Can't find a way to preserve the order of the objects during 'OrderBy'
// mySortedList.Select(keyValuePair => keyValuePair.Value).OrderBy(obj => obj.index);
// The select statement would not match the return type that promises IOrderedEnumerable
// mySortedList.OrderBy(keyValuePair => keyValuePair.Key).Select(keyValuePair => keyValuePair.Value);
}
Hat jemand ein Verfahren zum Extrahieren ein IOrderedEnumerable von einer SortedList zum Verbrauch? Als Randbemerkung, ich bin mir dessen bewusst, dass:
return mySortedList.Select(keyValuePair => keyValuePair.Value);
Würde ein IEnumerable zurückgeben, um ‚unter der Haube‘, aber wegen, wie wichtig die Reihenfolge, in der die zählbare ist verarbeitet bewahren würde, würde ich lieber Der Rückgabetyp muss beschreibend genug sein, um zu belegen, dass die zugrunde liegende Sammlung geordnet ist (um die API lesbarer zu machen).
Warum muss _have_ zu einem 'IOrderedEnumerable <>' umgewandelt werden? Es sollte wirklich keine Notwendigkeit geben. Sie wissen 'SortedList <,>' ist sortiert ... –
Ich denke, Sie sollten mit 'IEnumerable' gehen und fügen Sie einen Kommentar zu der Funktion, wie das Ergebnis sortiert ist. Die Rückgabe von "IOrderedEnumerable" sagt dem Kunden nicht wirklich etwas darüber, wie die Sammlungen sowieso geordnet sind. – Magnus
@JeffMercado, weil das Offenlegen des Schlüssels, der zum Sortieren der Elemente verwendet wurde, für die Verbraucher bedeutungslos ist und ich hoffe, meine Präsentation des Ergebnisses zu bereinigen. Um die Frage anders zu formulieren, wenn 'Zerlegen' eine Funktion war, die eine ganze Zahl faktorisierte und die Faktoren in der Reihenfolge zurückgab, in der sie entdeckt wurden, der resultierende 'Schlüssel' in der sortierten Liste (die Reihenfolge, in der der Faktor entdeckt wurde) , wäre sinnlos, sobald das Ergebnis erhalten wurde. – LiamK