以LINQ方式初始化Jagged数组

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

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分配引用。 有没有办法做到这一点,而不是太神秘?

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

在调用Repeat之前,你所拥有的东西不会起作用。 你需要一些能重复创建数组的东西。 这可以使用Enumerable.Range方法生成一个范围然后执行Select操作来实现,该操作将范围的每个元素映射到一个新的数组实例(如David B的答案 )。

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

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

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

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

行为是正确的 – Repeat()返回一个包含多次提供的对象的序列。 你可以做以下几招。

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

你不能用Repeat方法做到这一点: element参数只被评估一次,所以它确实总是重复相同的实例。 相反,您可以创建一个方法来执行您想要的操作,这将采用lambda而不是值:

  public static IEnumerable Sequence(Func generator, int count) { for (int i = 0; i < count; i++) { yield return generator(); } } ... var myArr = Sequence(() => new double[colCount], rowCount).ToArray(); 

我刚刚写了这个函数……

  public static T[][] GetMatrix(int m, int n) { var v = new T[m][]; for(int i=0;i 

似乎工作。

用法:

 float[][] vertices = GetMatrix(8, 3); 

关于什么

 var myArr = new double[rowCount, colCount]; 

要么

 double myArr = new double[rowCount, colCount]; 

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