Какой самый быстрый способ скопировать значения и ключи из одного словаря в другой в C #?
-
09-06-2019 - |
Вопрос
Похоже, что словаря нет.Метод AddRange().Кто-нибудь знает лучший способ скопировать элементы в другой словарь без использования цикла foreach?
Я использую эту Систему.Коллекции.Общий словарь.Это для .NET 2.0.
Решение
Нет ничего плохого в цикле for /foreach.В любом случае, это все, что мог бы сделать гипотетический метод AddRange.
Единственная дополнительная проблема, которая у меня возникла бы, - это поведение при распределении памяти, поскольку добавление большого количества записей может привести к многократному перераспределению и повторным хэшам.Невозможно увеличить емкость существующего словаря на заданную величину.Возможно, вам было бы лучше выделить новый словарь с достаточной емкостью для обоих текущих, но вам все равно понадобится цикл для загрузки хотя бы одного из них.
Другие советы
Там есть Dictionary
конструктор, который принимает другой Dictionary
.
Тебе придется разыграть его IDictionary
, но есть Add()
перегрузка, которая требует KeyValuePair<TKey, TValue>
.Тем не менее, вы все еще используете foreach .
var Animal = new Dictionary<string, string>();
можно передать существующий словарь животных конструктору.
Dictionary<string, string> NewAnimals = new Dictionary<string, string>(Animal);
Для развлечения я создал этот метод расширения для dictionary.Это должно сделать глубокое копирование везде, где это возможно.
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;
}
Если вы имеете дело с двумя существующими объектами, вы можете получить некоторый пробег с помощью метода CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx
Используйте метод Добавления другой коллекции (получателя), чтобы поглотить их.
Я не понимаю, почему не использовать Dictionary ( Словарь) (как предложено ageektrapped ).
Вы хотите выполнить Поверхностное копирование или Глубокое копирование?(то есть оба словаря указывают на одни и те же ссылки или на новые копии каждого объекта внутри нового словаря?)
Если вы хотите создать новое Словарь, указывающий на новое объекты, я думаю, что единственный способ - это через предначертание.