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
这种方式......