【问题标题】:.NET List<string> (call by reference?) with Dictionary objects.NET List<string> (通过引用调用?)与 Dictionary 对象
【发布时间】:2012-01-27 02:31:28
【问题描述】:

我有以下代码sn-p:

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, lists) 部分,“hello”和“world”被添加到键 1。但是一旦我执行 lists.Clear(),并将键 2 添加到 likeListDict,键 1 和键 2 现在都有“foobar”。如何停止这个(通过引用调用)并使其按值调用?

【问题讨论】:

  • 你可以试试吗? likeListDict.Add(1, 列表);列表=空;列表 = 新列表();
  • @DmitryBoyko:请不要将答案发布为 cmets。

标签: c# asp.net .net list


【解决方案1】:

没有“引用调用”或“值调用”的概念。 List&lt;T&gt; 是一种引用类型,因此无论您对给定引用执行什么操作,都将在程序中存在该引用的任何位置可见。

您要做的是创建一个新列表,而不是调用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);

【讨论】:

  • 很酷,这很有效...我很接近,因为我创建了一个名为 templist 的新列表,但随后做了 templist = lists,这是同样的问题,很酷 thx
  • 小补充:当然有pass by reference 或 value,这可能是“call” by reference 或 value 混淆的根源。当然,这个概念也与引用类型无关。
  • @phoog:是的,但考虑到它与手头的问题无关,我认为提出会适得其反
【解决方案2】:

制作第二个列表,不要尝试重复使用第一个列表。您在 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); 

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2019-01-29
    • 2018-01-25
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多