2012-01-27 17 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); 

    }