OrderedDictionary のインスタンス化は次のとおりです。
IOrderedDictionary orderedDictionary= gridview.DataKeys[index].Values;
OrderedDictionary は読み取り専用です。
読み取り専用ではない、orderedDictionary のディープ コピーを作成するにはどうすればよいですか? シリアライゼーション/デシリアライゼーションは機能せず、読み取り専用部分もコピーします。
OrderedDictionary のインスタンス化は次のとおりです。
IOrderedDictionary orderedDictionary= gridview.DataKeys[index].Values;
OrderedDictionary は読み取り専用です。
読み取り専用ではない、orderedDictionary のディープ コピーを作成するにはどうすればよいですか? シリアライゼーション/デシリアライゼーションは機能せず、読み取り専用部分もコピーします。
最も簡単な方法は、オブジェクトをコピーすることです。
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