Attualmente non riesco a trovare un modo per ottenere un oggetto IOrderedEnumerable da SortedList.Convert SortedList to IOrderedEnumerable
Ho un tipo complesso, lo chiameremo semplicemente 'A' per ora, che può essere scomposto in un numero enumerabile di tipo 'A'. Attualmente sto creando un SortedList in una funzione di decomposizione ricorsiva in cui la chiave, un int
, è legato alla fine il pezzo è stato scomposto in:
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;
}
Tuttavia, non voglio esporre il SortedList per i consumatori poiché il valore della chiave, correlato all'ordine di decomposizione, ha poco significato per i consumatori (specialmente come int
). L'unica cosa di cui un consumatore deve preoccuparsi è l'ordine finale dei pezzi in modo che ogni pezzo possa essere elaborato nell'ordine corretto. Preferirei esporre un oggetto IOrderedEnumerable ai consumatori. Ho pensato che questo sarebbe stato un compito abbastanza semplice dal momento che un SortedList è per molti versi molto simile ad un OrderedEnumerable, ma io non sono stato in grado di trovare una buona conversione ancora:
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);
}
Qualcuno ha un metodo per l'estrazione un IOrderedEnumerable da SortedList per il consumo? Come nota a margine, mi rendo conto che:
return mySortedList.Select(keyValuePair => keyValuePair.Value);
sarebbe tornato un IEnumerable che mantenere l'ordine 'sotto il cofano', ma a causa di quanto sia importante l'ordine in cui l'enumerabile viene elaborato è, avrei preferito il tipo di ritorno è abbastanza descrittivo da comunicare che la raccolta sottostante è ordinata (per rendere l'API più leggibile).
Perché deve essere _ coperto in un 'IOrderedEnumerable <>'? Non ci dovrebbe davvero essere alcun bisogno. Sai 'SortedList <,>' è ordinato ... –
Penso che dovresti andare con 'IEnumerable' e aggiungere un commento alla funzione come il risultato è ordinato. Restituire "IOrderedEnumerable" in realtà non dice al consumatore nulla su come le collezioni siano ordinate comunque. – Magnus
@JeffMercado, perché l'esposizione della chiave utilizzata per ordinare gli elementi è priva di significato per i consumatori e speravo di ripulire la mia presentazione del risultato. Per esprimere la domanda in un modo diverso, se 'Decompose' era una funzione che prime considerava un intero e restituiva i fattori nell'ordine in cui erano stati scoperti, la risultante 'chiave' nella lista ordinata (l'ordine in cui era stato scoperto il fattore) , sarebbe privo di significato una volta ottenuto il risultato. – LiamK