Si potrebbe "abuso" Concat
e Aggregate
come questo:
var A = new SortedDictionary<decimal,long>();
var B = new SortedDictionary<decimal,long>();
A.Add(1, 11);
A.Add(2, 22);
A.Add(3, 33);
B.Add(2, 222);
B.Add(3, 333);
B.Add(4, 444);
var C = A.Concat(B).Aggregate(
new SortedDictionary<decimal, List<long>>(),
(result, pair) => {
List<long> val;
if (result.TryGetValue(pair.Key, out val))
val.Add(pair.Value);
else
result.Add(pair.Key, new[] { pair.Value }.ToList());
return result;
}
);
foreach (var x in C)
Console.WriteLine(
string.Format(
"{0}:\t{1}",
x.Key,
string.Join(", ", x.Value)
)
);
L'output risultante:
1: 11
2: 22, 222
3: 33, 333
4: 444
Questo è più o meno lo stesso come se hai scritto un "normale" foreach
e sarebbe di fatto funziona su qualsiasi IEnumerable<KeyValuePair<decimal, long>>
(non solo su SortedDictionary<decimal, long>
) ed è facile estenderlo a più di due raccolte di input, se necessario.
Sfortunatamente, ignora completamente anche il fatto che l'input SortedDictionary
è, beh, ordinato, quindi le prestazioni non sono ottimali. Per prestazioni ottimali dovresti armeggiare con avanzamento lineare separato IEnumerator
per ciascuno dei dizionari ordinati di input, mentre confrontando costantemente gli elementi sottostanti - potresti evitare completamente TryGetValue
in questo modo ...
fonte
2012-04-11 13:45:46
Perché secondo KeyValuePair? Non è solo una lista? La lista –
Tigran
funzionerebbe pure. aggiunto in – Abstract
Cercando di essere sicuro di capire cosa stai cercando - vuoi che gli elementi presenti solo * uno * dei dizionari iniziali appaiano nel dizionario di output, o * solo * i tasti che appaiono in entrambi i dizionari? @Tigran - spero che questo chiarisca le cose –