1

辞書のマージ拡張メソッドを作成しようとしています。

私はC#で辞書をマージするソリューション が本当に好きです

キーが終了した場合に辞書アイテムを更新するように上記のソリューションを変更しようとしています。並行辞書は使いたくない。何か案は ?

public static void Merge<TKey, TValue>(this IDictionary<TKey, TValue> first, IDictionary<TKey, TValue> second)
        {
            if (second == null) return;
            if (first == null) first = new Dictionary<TKey, TValue>();
            foreach (var item in second)
            {
                if (!first.ContainsKey(item.Key))
                {
                    first.Add(item.Key, item.Value);
                }
                else
                {
                    **//I Need to perform following update . Please Help
                   //first[item.Key] = first[item.key] + item.Value**
                }
            }
        }
4

1 に答える 1

4

結果に両方の値を含めるには、それらを組み合わせるための何らかの手段が必要です。TValue値を「追加」する場合は、+演算子を定義するかどうかわからないため、2つの項目を組み合わせるための何らかの手段を定義する必要があります。1つのオプションは、デリゲートとして渡すことです。

public static void Merge<TKey, TValue>(this IDictionary<TKey, TValue> first
    , IDictionary<TKey, TValue> second
    , Func<TValue, TValue, TValue> aggregator)
{
    if (second == null) return;
    if (first == null) throw new ArgumentNullException("first");
    foreach (var item in second)
    {
        if (!first.ContainsKey(item.Key))
        {
            first.Add(item.Key, item.Value);
        }
        else
        {
           first[item.Key] = aggregator(first[item.key], item.Value);
        }
    }
}

それを呼び出すには、次のようになります。

firstDictionary.Merge(secondDictionary, (a, b) => a + b);

このようなマージ操作では、保持する2つの項目のいずれか、最初の項目または2番目の項目のいずれかを選択することも一般的です(適切なaggregator実装を使用して、上記の関数を使用して実行できることに注意してください)。

たとえば、アイテムを常に最初の辞書に保持するには、次を使用できます。

firstDictionary.Merge(secondDictionary, (a, b) => a);

常に2番目に置き換えるには:

firstDictionary.Merge(secondDictionary, (a, b) => b);
于 2013-02-28T22:05:24.007 に答える