Инициализация неровных массивов
-
20-09-2019 - |
Вопрос
Я хочу создать массив 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];
Решение
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;
}
Затем вы можете использовать это для создания трехуровневого зубчатого массива:
int[][][] count = CreateArray<int[][]>(10, () => CreateArray<int[]>(10, () => new int[10]));
Трехмерный массив звучит как хороший пример для создания вашего собственного класса.Объектно-ориентированный подход может быть прекрасным.
Нет "более элегантного" способа, чем написание 2 циклов for.Вот почему они называются "зазубренными", размеры каждого подмассива могут варьироваться.
Но это оставляет вопрос:почему бы не использовать версию [,,]?
int[][][] count = Array.ConvertAll(new bool[10], x =>
Array.ConvertAll(new bool[10], y => new int[10]));
Вы могли бы использовать набор данных с идентичными таблицами данных.Это могло бы вести себя как 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.
Есть какие-нибудь проблемы, которые вы видите с такого рода представлением??