使用LINQ方式初始化Jagged数组

时间:2009-07-08 18:14:46

标签: c# linq arrays initialization jagged-arrays

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

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

我想也许一些LINQ函数会在一个语句中给我一个优雅的方法。但是,我能想出的最接近的是:

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

问题是它似乎在创建一个double[colCount]并为每行分配一个新数组的intsead分配引用。有没有办法做到这一点而不会太神秘?

6 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:2)

在调用Repeat之前,new发生的内容无效。你需要一些能重复创建数组的东西。这可以使用Enumerable.Range method生成范围,然后执行Select operation来实现,该范围将范围的每个元素映射到新的数组实例(如David B's answer中所示)。

但是,我认为您正在尝试使用LINQ,在这种情况下,这样做并不合适。你在LINQ解决方案之前所拥有的就是好的。当然,如果你想要一种类似于Enumerable.Repeat的LINQ风格方法,你可以编写自己的扩展方法来生成一个新项目,例如:

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

然后你可以按如下方式调用它:

   var result = Repeat(()=>new double[rowCount], columnCount).ToArray();

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你不能用Repeat方法做到这一点:element参数只被评估一次,所以它确实总是重复同一个实例。相反,您可以创建一个方法来执行您想要的操作,这将采用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();

答案 4 :(得分:0)

我刚写了这个函数......

    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);

答案 5 :(得分:-1)

怎么样?
var myArr = new double[rowCount, colCount];

double myArr = new double[rowCount, colCount];

参考:http://msdn.microsoft.com/en-us/library/aa691346(v=vs.71).aspx