あなたは「乱用」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
どんなものでも機能し、必要に応じて 3 つ以上の入力コレクションに簡単に拡張できます。IEnumerable<KeyValuePair<decimal, long>>
SortedDictionary<decimal, long>
SortedDictionary
残念ながら、入力がソートされているという事実も完全に無視しているため、パフォーマンスは最適ではありません。IEnumerator
最適なパフォーマンスを得るには、基になる要素を常に比較しながら、入力ソートされた辞書ごとに個別に直線的に進める必要があります-TryGetValue
その方法を完全に回避できます...