C#には<string,object>
型の2つの辞書があります。ループを適用せずに、あるDictionaryオブジェクトのすべてのコンテンツを別のDictionaryオブジェクトにコピーするにはどうすればよいですか?
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);
}
まず、ループなしでは不可能です。そのループが(拡張)メソッドで実行されるかどうかは関係ありませんが、それでもループが必要です。
実際に手動で行うことをお勧めします。他のすべての回答では、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にマージするように簡単に変更できます。
var result = dictionaries.SelectMany(dict => dict)
.ToDictionary(pair => pair.Key, pair => pair.Value);