List <string []> </string []>的C#“有趣”问题

时间:2013-11-21 11:38:46

标签: c# arrays list inheritance

我的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”作为两个列表中第一个数组的第一个值。

你有一个很好的解释吗? :)

谢谢!

5 个答案:

答案 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());

虽然它会对该数组进行浅层复制,但它适用于您的情况