Dictionary.AddRange()メソッドがないようです。 foreachループを使用せずにアイテムを別の辞書にコピーするためのより良い方法を知っている人はいますか?.
System.Collections.Generic.Dictionaryを使用しています。これは.NET2.0用です。
For/foreachループに問題はありません。とにかく、これがすべて架空のAddRangeメソッドで実行されることです。
多数のエントリを追加すると、複数の再割り当てと再ハッシュが発生する可能性があるため、私が抱える唯一の追加の懸念は、メモリ割り当ての動作に関するものです。既存の辞書の容量を指定された量だけ増やす方法はありません。現在の両方に十分な容量の新しい辞書を割り当てる方がよい場合もありますが、少なくとも1つをロードするにはループが必要です。
別のDictionary
を取るDictionary
コンストラクタがあります。
IDictionary
をキャストする必要がありますが、_KeyValuePair<TKey, TValue>
_をとるAdd()
オーバーロードがあります。ただし、まだforeachを使用しています。
var Animal = new Dictionary<string, string>();
既存の動物辞書をコンストラクターに渡すことができます。
Dictionary<string, string> NewAnimals = new Dictionary<string, string>(Animal);
楽しみのために、私はこの辞書への拡張メソッドを作成しました。これにより、可能な限りディープコピーを実行する必要があります。
public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary<TKey, TValue> dictionary)
{
Dictionary<TKey, TValue> d2 = new Dictionary<TKey, TValue>();
bool keyIsCloneable = default(TKey) is ICloneable;
bool valueIsCloneable = default(TValue) is ICloneable;
foreach (KeyValuePair<TKey, TValue> kvp in dictionary)
{
TKey key = default(TKey);
TValue value = default(TValue);
if (keyIsCloneable)
{
key = (TKey)((ICloneable)(kvp.Key)).Clone();
}
else
{
key = kvp.Key;
}
if (valueIsCloneable)
{
value = (TValue)((ICloneable)(kvp.Value)).Clone();
}
else
{
value = kvp.Value;
}
d2.Add(key, value);
}
return d2;
}
既存の2つのオブジェクトを処理している場合は、CopyToメソッドを使用すると多少のメリットがあります。 http://msdn.Microsoft.com/en-us/library/cc645053.aspx
他のコレクション(レシーバー)のAddメソッドを使用して、それらを吸収します。
私は理解していません、(ageektrappedによって提案されたように)なぜDictionary(Dictionary)を使用しないのですか?.
浅いコピーと深いコピーのどちらを実行しますか? (つまり、両方のディクショナリが、新しいディクショナリ内のすべてのオブジェクトの同じ参照または新しいコピーを指していますか?)
newオブジェクトを指すnewディクショナリを作成する場合は、唯一の方法はforeachを使用することだと思います。