39

int[]長さのあるを作成し、X[0,1,2....X]で評価するのが好きです。

例えば

public int[] CreateAA(int X){}

int[] AA = CreateAA(9) => [0,1,2,3,4,5,6,7,8,9]

簡単な方法はありますか?または、ループして値を初期化する必要があります

4

6 に答える 6

85

IEnumerableの機能を利用できます。

int[] arr = Enumerable.Range(0, X+1).ToArray();

これにより、IEnumerableリストが作成され.ToArray()、int配列のニーズが満たされます。

したがって、X = 9の場合、[0,1,2,3,4,5,6,7,8,9](必要に応じて)の配列が生成されます。

于 2012-05-21T08:36:19.897 に答える
7

使用Enumerable.Range(0, 10).ToArray()は非常に簡潔ですが、非常に大きな配列を作成する場合、ToArray拡張メソッドは、複数回再割り当てする必要があるバッファーに数値を収集する必要があります。再割り当てのたびに、バッファーの内容が新しい大きなバッファーにコピーされます。.NETは、再割り当てごとにバッファーのサイズが2倍になる戦略を使用します(初期バッファーには4つの項目があります)。

したがって、バッファの複数の再割り当てを回避したい場合は、事前に配列を作成する必要があります。

int[] aa = new int[10];
for (var i = 0; i < aa.Length; i += 1)
  aa[i] = i;

これは、アレイを初期化する最も効率的な方法です。

ただし、たとえば1億個の連続した数値の配列が必要な場合は、メモリ要件の影響を回避するために、すべての数値を配列に保持する必要がない設計を検討する必要があります。IEnumerable<int>シーケンス全体を割り当てる必要はありませんが、反復中にシーケンスを生成できるため、この目的には非常に便利ですEnumerable.Range。したがって、そもそも連続した数字の配列を避けることは、それを作成する方法を考えるよりもさらに良いかもしれません。

于 2012-05-21T08:57:28.787 に答える
6

すでにそこにあるのになぜ関数を作るのか。

この特定の例では、

int[] AA = Enumerable.Range(0, 10).ToArray();

どこ0 is the starting value10 (X + 1) is the length of array

したがって、すべてに適用できる一般的なもの

int[] AA = Enumerable.Range(0, X + 1).ToArray();
于 2012-05-21T08:35:39.890 に答える
2

関数とループ付き:

static int[] f(int X)
{
    int[] a = new int[X+1];
    for(int i = 0; i < a.Length; i++)
        a[i] = i;
    return a;
}
于 2012-05-21T08:40:31.500 に答える
2

初期化するにはこれを試してください

int x = 10;
Enumerable.Range(0, x)
          .Select((v, i) => v + i).ToArray();
于 2012-05-21T09:03:30.123 に答える
1

完全を期すために、配列を作成する関数を次に示します。

CreateArray(0, 9)最小値と最大値のパラメーター、つまり戻り値を持つことで、もう少し用途が広くなりました{0,1,2,3,4,5,6,7,8,9}

static int[] CreateArray(int min, int max) {
  int[] a = new int[max - min + 1];
  for (int i = 0; i < a.Length; i++) {
    a[i] = min + i;
  }
  return a;
}
于 2012-05-21T08:50:50.310 に答える