我的C#应用程序中的List有一些奇怪的问题。它必须是分配错误或者我做错了(我是普通的C#开发人员)。 让我举一个接近我的例子的例子:
List<String[]> MyPrimaryList = new List<String[]>();
List<String[]> MySecondaryList = new List<String[]>();
String[] array;
String arrayList = "one,two,three,four,five";
array = arrayList.Split(',');
MyPrimaryList.Add(array);
MySecondaryList.Add(array);
MyPrimaryList[0][0] += "half";
所以现在我希望MyPrimaryList中第一个数组的第一个值在MySecondaryList中是“onehalf”和“one”。 但我的问题是两个列表都更新了“onehalf”作为两个列表中第一个数组的第一个值。
你有一个很好的解释吗? :)
谢谢!
答案 0 :(得分:18)
String[] array;
是参考类型。您已将此对象的内存中位置的引用添加到两个列表,因此它们都保存相同的数据。
如果您需要第二个列表来获得array
的副本,那么您可以使用Array.Copy:
List<String[]> MyPrimaryList = new List<String[]>();
List<String[]> MySecondaryList = new List<String[]>();
String arrayList = "one,two,three,four,five";
String[] array = arrayList.Split(',');
String[] array2 = new string[5];
Array.Copy(array, array2, 5);
MyPrimaryList.Add(array);
MySecondaryList.Add(array2);
MyPrimaryList[0][0] += "half";
Console.WriteLine(MyPrimaryList[0][0]);
Console.WriteLine(MySecondaryList[0][0]);
这将获取源数组,目标数组和长度 - 小心检查数组边界。
输出:
onehalf
one
由于每个列表现在都包含对不同数组的引用,因此您可以单独操作数组项。
答案 1 :(得分:9)
您正在向两个列表添加相同的数组实例,因此它们指向相同的内存结构。
如果你想让它们独立,你需要克隆它们;从我的头脑中快速的方法是在其中一个列表中使用linq list.Add(array.ToArray())
答案 2 :(得分:7)
数组是引用对象,因此您要在内存中修改相同的集合。您所做的只是添加指向同一结构的指针,
查看本文档
Passing Arrays as Arguments (C# Programming Guide)
您需要对数组进行深层复制才能获得所需的自主权。
您可以使用Array.Copy
答案 3 :(得分:0)
您应该为您正在使用的每个列表创建一个数组,因为现在您指向的是相同的内存结构
正确的代码应该是:
List<String[]> MyPrimaryList = new List<String[]>();
List<String[]> MySecondaryList = new List<String[]>();
String[] array;
String[] secondaryArray;
String arrayList = "one,two,three,four,five";
array = arrayList.Split(',');
secondaryArray = arrayList.Split(',');
MyPrimaryList.Add(array);
MySecondaryList.Add(secondaryArray);
MyPrimaryList[0][0] += "half";
现在你的第二个列表将是“one”而不是“onehalf”作为第一个元素
答案 4 :(得分:0)
如上所述,数组是引用类型,因此两个列表都指向同一个数组
要解决您的问题,请使用Clone方法..
MyPrimaryList.Add((String[])array.Clone());
MySecondaryList.Add((String[])array.Clone());
虽然它会对该数组进行浅层复制,但它适用于您的情况