c# - 初始化由相同元素填充的数组的数组

标签 c# arrays

var board = Enumerable.Repeat(Enumerable.Repeat('.', 3).ToArray(), 3).ToArray();
board[0][0] = 'Q';


在这里,我尝试创建由相同元素填充的数组(3 * 3)的数组。
但是,当我尝试更改一个元素([0,0])时,它将更改所有三个数组的第一个元素。为什么会这样,又如何在没有2个循环来启动数组的情况下解决此问题呢?

最佳答案

Enumerable.Repeat()返回您给它的东西。它不会每次都创建一个新副本。

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

char x = 'y';


分配值类型时,您无法创建它的副本。

但是数组是引用类型,规则不同。外部Enumerable.Repeat()返回相同的数组对象3次。您没有传递指令三次创建新数组。您正在传递对现有数组的引用,并说“三遍给我”。而且与字符不同,再次为您提供相同的数组不会创建它的副本。

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

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


ay是同一对象。如果设置a[0] = 'd';,则可以使用引用y查看相同的数组对象,并且在[0]中将看到相同的字母'd'。

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

如果需要Linq,这就是您想要的:

var board = Enumerable.Range(0, 3)
            .Select(n => Enumerable.Repeat('.', 3).ToArray())
            .ToArray();


Select()每次都会执行代码,因此您执行的代码可以每次创建一个新数组。 Repeat()只会不断返回您赋予它的任何值。

关于c# - 初始化由相同元素填充的数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44181267/

相关文章:

c# - 如何在通用 Windows 平台中访问相机帧

c# - 在 Visual Studio 中,如何从项目资源文件夹加载 .png 图像?

c# - 将从 Android 应用发送的用户名和密码读入我的 WCF REST 服务?

Java 数组,查找重复项

c++ - 为什么我不能使用与 'const int*' 相同的 'const char*' 制作一个 int 数组?

c# - 在 C# 中转换为泛型类型

javascript - 为什么 JavaScript 中的 return 语句不返回任何内容?

javascript - 在选择器中获取数组的最后2个元素(Redux)

c - 无法将赋值中的“float *”转换为“float”

c# - 如何序列化System.Diagnostics.Stopwatch