0

OrderedDictionary のインスタンス化は次のとおりです。

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

OrderedDictionary は読み取り専用です。

読み取り専用ではない、orderedDictionary のディープ コピーを作成するにはどうすればよいですか? シリアライゼーション/デシリアライゼーションは機能せず、読み取り専用部分もコピーします。

4

1 に答える 1

1

最も簡単な方法は、オブジェクトをコピーすることです。

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

更新:
このコードは、ディクショナリ内の値のディープ コピーを作成しません。
例:

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」と同じリストを持つ 1 つのエントリが含まれます。リストは 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
于 2011-07-08T08:41:56.150 に答える