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