2012-01-27 44 views
0

我有下面的代碼片段:.NET名單<string>(?傳引用調用)與Dictionary對象

Dictionary<int, List<string>> likeListDict = new Dictionary<int, List<string>>(); 
List<string> lists = new List<string>(); 

lists.Add("hello"); 
lists.Add("world"); 

likeListDict.Add(1, lists); 

lists.Clear(); 

lists.Add("foobar"); 

likeListDict.Add(2, lists); 

在likeListDict.Add(1,列表)的一部分, 「你好」 和 「世界」被添加到關鍵字1.但是,一旦我做了清單。清除(),並添加到keyList 2 LikeListDict,關鍵1和2現在都有「foobar」。我如何阻止這種情況(通過引用進行調用)並按價值進行調用?

+0

難道ü嘗試什麼呢? likeListDict.Add(1,lists); lists = null; lists = new List (); – 2012-01-27 02:34:16

+0

@DmitryBoyko:請不要將回復作爲評論發佈。 – 2012-01-27 02:35:14

回答

5

沒有「通過引用調用」或「按值呼叫」的概念。 List<T>是一個引用類型,因此無論您對給定引用做什麼,該引用都會在程序中的任何地方可見。

你想要做的就是創建一個新的列表,而不是調用lists.Clear();

Dictionary<int, List<string>> likeListDict = new Dictionary<int, List<string>>(); 
List<string> lists = new List<string>(); 

lists.Add("hello"); 
lists.Add("world"); 

likeListDict.Add(1, lists); 

lists = new List<string>(); 

lists.Add("foobar"); 

likeListDict.Add(2, lists); 
+0

很酷這個工作...我接近,因爲我創建了一個名爲templist的新列表,但後來做了templist =列表,這是同樣的問題,很酷的thx – cdub 2012-01-27 02:42:36

+1

小增加:當然有*通過引用或值,這是可能是引用或價值引起的「呼叫」混淆的根源。當然,這個概念也與參考類型無關。 – phoog 2012-01-27 04:10:18

+1

@phoog:是的,但是鑑於它與手頭的問題無關,我認爲這樣做會起反作用 – 2012-01-27 04:50:21

1

做第二個列表,不要嘗試重用第一個列表。您在Dictionary中存儲對lists的引用,因此將其添加兩次會導致字典中的相同引用出現兩次,因此列表中的更改將反映在字典中的兩個條目中。

例:

public static void Main() 
    { 
     var likeListDict = new Dictionary<int, List<string>>(); 

     var lists = new List<string> {"hello", "world"}; 
     likeListDict.Add(1, lists); 

     var secondList = new List<string> {"foobar"}; 
     likeListDict.Add(2, secondList); 

    }