web-dev-qa-db-ja.com

ループせずに2つの辞書を組み合わせる方法は?

C#には<string,object>型の2つの辞書があります。ループを適用せずに、あるDictionaryオブジェクトのすべてのコンテンツを別のDictionaryオブジェクトにコピーするにはどうすればよいですか?

45
Pradeep
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value);

Concat を使用できます。

Dictionary<string, object> d1 = new Dictionary<string, object>();
d1.Add("a", new object());
d1.Add("b", new object());
Dictionary<string, object> d2 = new Dictionary<string, object>();
d2.Add("c", new object());
d2.Add("d", new object());

Dictionary<string, object> d3 = d1.Concat(d2).ToDictionary(e => e.Key, e => e.Value);

foreach (var item in d3)
{
    Console.WriteLine(item.Key);
}
42
bruno conde

まず、ループなしでは不可能です。そのループが(拡張)メソッドで実行されるかどうかは関係ありませんが、それでもループが必要です。

実際に手動で行うことをお勧めします。他のすべての回答では、2つの拡張メソッド(Concat-ToDictionaryおよびSelectMany-ToDictionary)を使用する必要があるため、2回ループします。コードを最適化するためにこれを実行している場合、辞書Bでループを実行し、その内容を辞書Aに追加する方が高速です。

編集:さらなる調査の後、Concat操作はToDictionary呼び出し中にのみ発生しますが、カスタム拡張メソッドの方が効率的であると思います。

コードサイズを縮小する場合は、拡張メソッドを作成します。

public static class DictionaryExtensions
{
    public static IDictionary<TKey,TVal> Merge<TKey,TVal>(this IDictionary<TKey,TVal> dictA, IDictionary<TKey,TVal> dictB)
    {
        IDictionary<TKey,TVal> output = new Dictionary<TKey,TVal>(dictA);

        foreach (KeyValuePair<TKey,TVal> pair in dictB)
        {
            // TODO: Check for collisions?
            output.Add(pair.Key, Pair.Value);
        }

        return output;
    }
}

次に、DictionaryExtensions名前空間をインポート(「使用」)し、次のように記述することで使用できます。

IDictionary<string,objet> output = dictA.Merge(dictB);

オブジェクトが不変であるようにメソッドを動作させましたが、新しい辞書を返さずにdictAにマージするように簡単に変更できます。

9
Richard Szalay
var result = dictionaries.SelectMany(dict => dict)
             .ToDictionary(pair => pair.Key, pair => pair.Value);
5