你可以「濫用」 Concat
和Aggregate
這樣的:
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)
)
);
輸出結果:
1: 11
2: 22, 222
3: 33, 333
4: 444
這幾乎是一樣的,如果你寫了一個「正常」的foreach
並會實際上可以在任何IEnumerable<KeyValuePair<decimal, long>>
(而不僅僅是SortedDictionary<decimal, long>
)上工作,並且如果需要,很容易擴展到兩個以上的輸入集合。
不幸的是,它也完全忽視了這樣一個事實,即輸入SortedDictionary
很好地被排序,因此性能不是最優的。爲了獲得最佳性能,您必須爲每個輸入的已排序詞典提供線性前進單獨IEnumerator
,同時不斷比較基本元素 - 您可以完全避免TryGetValue
這種方式...
爲什麼第二個是KeyValuePair?不應該只是一個列表? –
Tigran
2012-04-11 12:35:45
列表將工作。將其添加到 – Abstract 2012-04-11 12:37:37
試圖確保我理解您的內容 - 是否希望初始字典中只有*一個*的元素出現在輸出字典中,或者只有*鍵出現在兩個字典中? @Tigran--希望這會清除一切 – 2012-04-11 13:11:30