質問
私は(int[][][]
ない)int[,,]
のようなC#でアレイ10 * 10 * 10を作成したい。
私は、コードを書くことができます:
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];
解決
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;
}
他のヒント
あなたはこれを試すことができます:
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()
}
};
そこには配列を作成し、その中のすべての要素を作成する方法で構築されていないので、あなたがそれを可能にするだろうかシンプルにさえ近いことがないだろう。それが本当にあるとして多くの仕事になるだろう。
あなたは、アレイとその中のすべてのオブジェクトを作成するための方法を作ることができます:
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]));
3次元配列は、独自のクラスを作成するための優れたケースのように聞こえます。オブジェクト指向であることは美しいことができます。
2 forループを書くよりも「よりエレガントな」方法はありません。それは彼らが各サブアレイのサイズは変えることができる、「ギザギザ」と呼ばれている理由です。
しかし、それは疑問の葉:?なぜ[,,]バージョンを使用しない
int[][][] count = Array.ConvertAll(new bool[10], x =>
Array.ConvertAll(new bool[10], y => new int[10]));
あなたは、同一のDataTableにデータセットを使用することができます。それは、3Dオブジェクト(XYZ =行、列、テーブル)のように振る舞うことができ...しかし、あなたはあなたが何で何か大きなで終わるんするつもりです。あなたはまだ1000の項目を考慮する必要があります。
のLINQのの
から少し助けを借りてint[][][] count = new int[10][][].Select(t => new int[10][].Select(tt => new int[10]).ToArray()).ToArray();
これは確かに速く、かなり、おそらくいないではありませんが、ワンライナーです。
なぜあなたはこれを試してみませんか?
int[,,] count = new int[10, 10, 10]; // Multi-dimentional array.
あなたは表現のこの種の参照のどれでも問題??