.NET列表<;字符串>;(通过引用调用?)具有Dictionary对象

本文关键字:调用 具有 Dictionary 引用 对象 lt 列表 字符串 gt NET | 更新日期: 2023-09-27 18:21:29

我有以下代码片段:

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"answers"world"被添加到键1中。但一旦我做了清单。Clear(),并添加类似ListDict的键2,键1和2现在都有"foobar"。如何停止此操作(通过引用调用)并使其通过值调用?

.NET列表<;字符串>;(通过引用调用?)具有Dictionary对象

没有"通过引用调用"或"通过值调用"的概念。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);

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