List <String []>的C#"有趣"问题

Mic*_*sen 10 c# arrays inheritance list

我的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";
Run Code Online (Sandbox Code Playgroud)

所以现在我希望MyPrimaryList中第一个数组中的第一个值在MySecondaryList中是"onehalf"和"one".但我的问题是两个列表都更新为"onehalf"作为两个列表中第一个数组的第一个值.

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

谢谢!!

DGi*_*bbs 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]);
Run Code Online (Sandbox Code Playgroud)

这将获取源数组,目标数组和长度 - 小心检查数组边界.

这输出:

onehalf
one
Run Code Online (Sandbox Code Playgroud)

由于每个列表现在都包含对不同数组的引用,因此您可以单独操作数组项.


Seb*_*Piu 9

您正在向两个列表添加相同的数组实例,因此它们指向相同的内存结构.

如果你想让它们独立,你需要克隆它们; 从我的头脑中快速的方法是list.Add(array.ToArray())在其中一个列表中使用linq


Dav*_*ton 7

数组是引用对象,因此您要在内存中修改相同的集合.您所做的只是添加指向同一结构的指针,

看看这个文档

将数组作为参数传递(C#编程指南)

您需要对数组进行深层复制才能获得所需的自治权.

你可以这样做 Array.Copy