如何按值而不是按引用将数组添加到列表中?

Posted

技术标签:

【中文标题】如何按值而不是按引用将数组添加到列表中?【英文标题】:How to add an array to a list by value not by reference? 【发布时间】:2014-05-18 21:52:46 【问题描述】:

有没有办法通过值而不是通过引用将数组添加到数组列表中?

示例:以下打印出“6, 7, 8, 9, 10”。我希望它写出“1、2、3、4、5”。

int[] testArray = new int[5]  1, 2, 3, 4, 5 ;
List<int[]> testList = new List<int[]>();

testList.Add(testArray);

testArray[0] = 6;
testArray[1] = 7;
testArray[2] = 8;
testArray[3] = 9;
testArray[4] = 10;

foreach(int[] array in testList)

    Console.WriteLine("0, 1, 2, 3, 4", array[0], array[1], array[2], array[3], array[4]);

【问题讨论】:

您需要创建数组的副本。 所有内容都按值添加到列表中。您的困惑源于数组与所有对象一样不是 C# 中的值。 testArray 不是一个对象——它是一个引用(指向一个对象的指针)。 【参考方案1】:

复制一份:

testList.Add(testArray.ToArray());

【讨论】:

【参考方案2】:

您必须Clone() 数组,即创建数组的浅表副本并将其添加到列表中。

testList.Add((int[])testArray.Clone());

【讨论】:

【参考方案3】:

代替

testList.Add(testArray);

使用

testList.Add(testArray.Clone() as int[]);

【讨论】:

Clone() 返回对象,因此您必须将其类型转换回数组。

以上是关于如何按值而不是按引用将数组添加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何按值而不是按引用复制对象[重复]

按值而不是按引用复制对象

Obj-C,iOS,我如何按值而不是键排序,sortedArrayUsingSelector,目前@selector(compare:)]

按值而不是引用将 List<T> 分配给另一个 List<T> [重复]

如何推送对象值而不是数组中对象的引用

在lisp中按值传递参数