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”的条目和相同的列表。从任何字典中的该列表中删除一个项目也将更改另一个字典中列表的内容,因为只有一个列表。
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