你可以“滥用” 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