11

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

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

4

6 回答 6

26
double[][] myArr = Enumerable
  .Range(0, rowCount)
  .Select(i => new double[colCount])
  .ToArray();
于 2009-07-08T18:27:30.003 回答
1

new调用Repeat. 您需要一些也可以重复创建数组的东西。这可以使用生成范围的Enumerable.Range方法来实现,然后执行将范围的每个元素映射到新数组实例的Select操作(如Amy B 的答案)。

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

    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();
于 2009-07-08T18:27:52.640 回答
0

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

double[][] myArr = Enumerable
    .Repeat(0, rowCount)
    .Select(i => new double[colCount])
    .ToArray();
于 2009-07-08T18:30:37.360 回答
0

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

    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();
于 2009-07-08T18:32:15.550 回答
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);
于 2011-12-24T02:50:12.883 回答
-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

于 2014-10-07T18:32:30.303 回答