11

従来のループを使用して初期化する 2 次元のギザギザ配列 (常に長方形ですが) があります。

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

何らかの LINQ 関数を使用すると、1 つのステートメントでこれを行うエレガントな方法が得られるのではないかと考えました。ただし、私が思いつくことができる最も近いものはこれです:

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

この関数を書いたばかりです...

    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 に答える
0

動作は正しいです -Repeat()指定されたオブジェクトを複数回含むシーケンスを返します。次のトリックを実行できます。

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

Repeatmethodではそれを行うことはできません:elementパラメータは 1 回だけ評価されるため、実際には常に同じインスタンスが繰り返されます。代わりに、値の代わりにラムダを取るメソッドを作成して、必要なことを行うことができます。

    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 に答える
-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 に答える