2011-07-08 24 views
0

的orderedDictionary實例是這樣的:如何使用鍵和值爲不再只讀的字符串的只讀OrderedDictionary的深層副本?

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

orderedDictionary是隻讀的。

如何製作不可讀的orderedDictionary的深層副本?序列化/反序列化不起作用,因爲它也複製只讀部分。

+0

而不是r eprise深度討論我提供了一箇舊問題的鏈接http://stackoverflow.com/q/78536/659190 – Jodrell

回答

1

最簡單的方法是把剛纔複製的對象:

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 
+0

正是我在想什麼,但是,這只是從一個字典複製引用到另一個?那會是「深」嗎? – Jodrell

+1

@Jodrell:你說得對,這不是一個很深的副本。儘管OP要求做一個深層複製,但我不認爲他真的想這樣做。我這樣讀他的問題,他只是想創建一個不是隻讀的新OrderedDictionary。不過,我可能是錯的。 –

+0

@Daniel Hilgarth:你的解決方案很好,它完成orderedDictionary的深層副本,我測試了它,修改newDictionary值不會影響orderedDicionary值。謝謝! –