24

配列10*10 * 10をC#のように作成したいint[][][](ではないint[,,])。

私はコードを書くことができます:

int[][][] count = new int[10][][];

for (int i = 0; i < 10; i++) 
{
    count[i] = new int[10][];

    for (int j = 0; j < 10; j++)
        count[i][j] = new int[10];
}

しかし、私はそれのためのより美しい方法を探しています。そのようなものかもしれません:

int[][][] count = new int[10][10][10];
4

9 に答える 9

25
int[][][] my3DArray = CreateJaggedArray<int[][][]>(1, 2, 3);

を使用して

static T CreateJaggedArray<T>(params int[] lengths)
{
    return (T)InitializeJaggedArray(typeof(T).GetElementType(), 0, lengths);
}

static object InitializeJaggedArray(Type type, int index, int[] lengths)
{
    Array array = Array.CreateInstance(type, lengths[index]);
    Type elementType = type.GetElementType();

    if (elementType != null)
    {
        for (int i = 0; i < lengths[index]; i++)
        {
            array.SetValue(
                InitializeJaggedArray(elementType, index + 1, lengths), i);
        }
    }

    return array;
}
于 2009-11-15T22:17:01.997 に答える
18

あなたはこれを試すことができます:


int[][][] data =
{
    new[]
    {
        new[] {1,2,3}
    }, 
    new[]
    {
        new[] {1,2,3}
    }
};

または、明示的な値がない場合:


int[][][] data =
{
    new[]
    {
        Enumerable.Range(1, 100).ToArray()
    }, 
    new[]
    {
        Enumerable.Range(2, 100).ToArray()
    }
};

于 2015-03-23T15:59:26.560 に答える
8

配列を作成し、その中にすべての要素を作成するための組み込みの方法はありません。そのため、配列がどれほど単純になりたいかということにさえ近づきません。それは実際と同じくらい多くの仕事になるでしょう。

配列とその中のすべてのオブジェクトを作成するためのメソッドを作成できます。

public static T[] CreateArray<T>(int cnt, Func<T> itemCreator) {
  T[] result = new T[cnt];
  for (int i = 0; i < result.Length; i++) {
    result[i] = itemCreator();
  }
  return result;
}

次に、それを使用して3レベルのジャグ配列を作成できます。

int[][][] count = CreateArray<int[][]>(10, () => CreateArray<int[]>(10, () => new int[10]));
于 2009-11-15T22:13:40.163 に答える
2

Linqの少しの助けを借りて

int[][][] count = new int[10][][].Select(t => new int[10][].Select(tt => new int[10]).ToArray()).ToArray();

それは確かにきれいではなく、おそらく速くはありませんが、それはワンライナーです。

于 2018-07-19T11:38:04.817 に答える
1

2つのforループを作成するよりも「エレガントな」方法はありません。そのため、これらは「ギザギザ」と呼ばれ、各サブアレイのサイズはさまざまです。

しかし、それは疑問を残します:なぜ[,,]バージョンを使用しないのですか?

于 2009-11-15T22:14:15.980 に答える
1
int[][][] count = Array.ConvertAll(new bool[10], x =>
                  Array.ConvertAll(new bool[10], y => new int[10]));
于 2016-02-24T23:46:41.497 に答える
0

同一のデータテーブルを持つデータセットを使用できます。これは3Dオブジェクト(xyz =行、列、テーブル)のように動作する可能性があります...しかし、何をしても大きなものになってしまいます。あなたはまだ1000アイテムを説明する必要があります。

于 2009-11-15T22:04:42.110 に答える
0

3次元配列は、独自のクラスを作成するのに適したケースのように思えます。オブジェクト指向であることは美しいことがあります。

于 2009-11-15T22:00:34.733 に答える
-1

やってみませんか?

int[,,] count = new int[10, 10, 10]; // Multi-dimentional array.

この種の表現で何か問題がありますか?

于 2019-01-23T14:56:11.887 に答える