Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 初始化使用相同元素填充的数组数组_C#_Arrays - Fatal编程技术网

C# 初始化使用相同元素填充的数组数组

C# 初始化使用相同元素填充的数组数组,c#,arrays,C#,Arrays,在这里,我试图创建一个数组(3*3),数组中填充了相同的元素。 但当我尝试更改一个元素([0,0])时,它会更改所有三个数组的第一个元素。为什么会这样?如果没有两个循环来启动数组,如何修复此行为?因为您创建了一个可枚举的数组。重复('.',3).ToArray()并克隆对该数组的引用3次。 所以,在一个值上有3个引用。 您需要初始化每一行: var board = Enumerable.Repeat(Enumerable.Repeat('.', 3).ToArray(), 3).ToArray(

在这里,我试图创建一个数组(3*3),数组中填充了相同的元素。
但当我尝试更改一个元素([0,0])时,它会更改所有三个数组的第一个元素。为什么会这样?如果没有两个循环来启动数组,如何修复此行为?

因为您创建了一个可枚举的数组。重复('.',3).ToArray()并克隆对该数组的引用3次。 所以,在一个值上有3个引用。 您需要初始化每一行:

var board = Enumerable.Repeat(Enumerable.Repeat('.', 3).ToArray(), 3).ToArray();
board[0][0] = 'Q';
var board=Enumerable.Repeat((char[])null,3.ToArray();
对于(int i=0;i<3;i++)
{
board[i]=可枚举的.Repeat('.',3.ToArray();
}
板[0][0]=“Q”;
可枚举。Repeat()
返回您给它的东西。它不会每次都创建它的新副本

内部
Enumerable.Repeat()
返回字符“.”三次。字符是“值类型”,这意味着这将创建字符“y”的新副本:

var board = Enumerable.Repeat((char[])null, 3).ToArray();
for (int i = 0; i < 3; i++)
{
    board[i] = Enumerable.Repeat('.', 3).ToArray();
}
board[0][0] = 'Q';
赋值时不能创建值类型的副本

但是数组是引用类型,规则不同。外部
Enumerable.Repeat()
返回同一数组对象三次。您没有三次传入创建新数组的指令。您正在传递一个对现有数组的引用,并说“给我那个东西,三次”。与角色不同的是,再次给你相同的数组不会创建它的副本

数组是“引用类型”,这意味着下面的第二行创建了对同一对象的新引用:

a
y
是同一个对象。如果您将
a[0]='d'
,您可以使用引用
y
查看相同的数组对象,您将在
[0]
中看到相同的字母“d”

Enumerable.Repeat()
返回相同的内容x次。如果您试图创建一个值类型的多个实例,那么这不是您想要的

这就是你想要的,如果你想要的话,Linq:

char[] a = new [] { 'a', 'b', 'c' };
var y = a;

Select()
每次执行代码,因此每次执行的代码都可以创建一个新数组
Repeat()
只需不断返回您给定的值即可

是否有一个原因,你不宣布董事会作为一个数组从一开始?也许如果您这样做了,您可以声明要访问哪个数组。@ethebrage无论OP是否将其声明为
char[][]board
var
都会处理相同的数组。
char[] a = new [] { 'a', 'b', 'c' };
var y = a;
var board = Enumerable.Range(0, 3)
            .Select(n => Enumerable.Repeat('.', 3).ToArray())
            .ToArray();