C# 以LINQ方式初始化锯齿状数组

C# 以LINQ方式初始化锯齿状数组,c#,linq,arrays,initialization,jagged-arrays,C#,Linq,Arrays,Initialization,Jagged Arrays,我有一个二维锯齿状数组(尽管它总是矩形的),我使用传统的循环初始化它: var myArr = new double[rowCount][]; for (int i = 0; i < rowCount; i++) { myArr[i] = new double[colCount]; } 问题在于,它似乎在创建一个double[colCount],并将引用分配给该项,而不是为每行分配一个新数组。有没有一种方法可以做到这一点而不会变得太神秘?您所拥有的将不起作用,因为新的将在调用之前

我有一个二维锯齿状数组(尽管它总是矩形的),我使用传统的循环初始化它:

var myArr = new double[rowCount][];
for (int i = 0; i < rowCount; i++) {
    myArr[i] = new double[colCount];
}

问题在于,它似乎在创建一个
double[colCount]
,并将引用分配给该项,而不是为每行分配一个新数组。有没有一种方法可以做到这一点而不会变得太神秘?

您所拥有的将不起作用,因为新的
将在调用之前出现。您需要一些同样重复创建数组的东西。这可以通过使用生成范围,然后执行将范围的每个元素映射到新数组实例(如中所示)的操作来实现

double[][] myArr = Enumerable
  .Range(0, rowCount)
  .Select(i => new double[colCount])
  .ToArray();
然而,我认为您正在尝试使用LINQ,但在这种情况下使用LINQ并不合适。在使用LINQ解决方案之前,您所拥有的一切都很好。当然,如果您想要类似的LINQ风格方法,您可以编写自己的扩展方法来生成新项,例如:

    public static IEnumerable<TResult> Repeat<TResult>(
          Func<TResult> generator,
          int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

行为正确-
Repeat()
多次返回包含所提供对象的序列。您可以执行以下技巧

double[][] myArr = Enumerable
    .Repeat(0, rowCount)
    .Select(i => new double[colCount])
    .ToArray();

使用
Repeat
方法无法做到这一点:
元素
参数只计算一次,因此它总是重复相同的实例。相反,您可以创建一个方法来执行您想要的操作,该方法将采用lambda而不是值:

    public static IEnumerable<T> Sequence<T>(Func<T> generator, int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

    ...

    var myArr = Sequence(() => new double[colCount], rowCount).ToArray();
公共静态IEnumerable序列(Func生成器,int计数)
{
for(int i=0;inewdouble[colCount],rowCount).ToArray();

我刚刚编写了这个函数

    public static T[][] GetMatrix<T>(int m, int n)
    {
        var v = new T[m][];
        for(int i=0;i<m; ++i) v[i] = new T[n];
        return v;
    }
publicstatict[]GetMatrix(intm,intn)
{
var v=新的T[m][];
对于(inti=0;i

var myArr = new double[rowCount, colCount];


参考资料:

与我的答案完全相同……但你更快;)这不是按要求创建锯齿状数组。抱歉,Servy,你说得对。你已经认识到数组总是矩形的,所以为什么需要锯齿状数组?满足第一个位置的数组是动态加载的,或者你试图避免任何类型的限制,如内存?这不是我的程序。我不知道他为什么需要锯齿状数组多维数组上的锯齿数组。
    public static T[][] GetMatrix<T>(int m, int n)
    {
        var v = new T[m][];
        for(int i=0;i<m; ++i) v[i] = new T[n];
        return v;
    }
float[][] vertices = GetMatrix<float>(8, 3);
var myArr = new double[rowCount, colCount];
double myArr = new double[rowCount, colCount];