Как я могу сделать глубокую копию только для чтения OrderedDictionary с ключами и значениями, являющимися строками, которые больше не только для чтения? - PullRequest
0 голосов
/ 08 июля 2011

Экземпляр orderDictionary выглядит так:

IOrderedDictionary orderedDictionary= gridview.DataKeys[index].Values;

ordersDictionary доступен только для чтения.

Как я могу сделать полную копию заказанного словаря, который не только для чтения? Сериализация / десериализация не работает, потому что она также копирует часть только для чтения.

1 Ответ

1 голос
/ 08 июля 2011

Самый простой способ - просто скопировать объекты:

var newDictionary = new OrderedDictionary();
foreach(DictionaryEntry de in orderedDictionary)
{
    newDictionary.Add(de.Key, de.Value);
}

UPDATE:
Этот код НЕ создает глубокую копию значений в словаре.
Пример:

var orderedDictionary = new OrderedDictionary();
orderedDictionary.Add("1", new List<int> { 1, 2 });

var newDictionary = new OrderedDictionary();
foreach(DictionaryEntry de in orderedDictionary)
{
    newDictionary.Add(de.Key, de.Value);
}

Оба словаря будут содержать одну запись с ключом «1» и тот же список. Удаление элемента из этого списка в любом из словарей также изменит содержимое списка в другом словаре, поскольку существует только один список.

Console.WriteLine(((List<int>)orderedDictionary["1"]).Count);
Console.WriteLine(((List<int>)newDictionary["1"]).Count);
Console.WriteLine(ReferenceEquals(orderedDictionary["1"], newDictionary["1"]));
((List<int>)orderedDictionary["1"]).Remove(1);
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count);
Console.WriteLine(((List<int>)newDictionary["1"]).Count);

Это выведет следующее:

2
2
True
1
1

Назначение нового значения ключу в одном из словарей, однако не влияет на другой словарь:

newDictionary["1"] = new List<int>{3,4};
Console.WriteLine(ReferenceEquals(orderedDictionary["1"], newDictionary["1"]));
Console.WriteLine(((List<int>)orderedDictionary["1"]).Count);
Console.WriteLine(((List<int>)newDictionary["1"]).Count);

Будет выведено:

False
2
3
...