Intereting Posts
WCF Service возвращает 400 ошибок: тело сообщения не может быть прочитано, потому что оно пустое Создает ли общий метод C #, который допускает (нулевой) тип значения и ссылочный тип? GetName для enums с повторяющимися значениями C # / winforms: как наилучшим образом привязать свойствоgrid и System.Data.DataRow Как сделать WPF Expander Stretch? Определение локальной переменной const vs Class const Скопируйте один массив строк в другой Почему компилятор не может указать лучшую цель преобразования в этом случае разрешения перегрузки? (ковариация) «Вызов функции PInvoke несбалансировал стек» AvalonEdit WPF TextEditor (SharpDevelop): как выделить определенный диапазон текста? Выполните делегирование в streamе ui (используя насос сообщений) Как глобальная функция существует в C #? Запуск функции при запуске WCF MVC6 Раскрывающийся список стран Создание счетчика PerfMon для записи среднего за один вызов (C #)

Инициализация зубчатых массивов

Я хочу создать массив 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(1, 2, 3); 

с помощью

 static T CreateJaggedArray(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[] { new[] {1,2,3} }, new[] { new[] {1,2,3} } }; 

Или без явных значений:

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

Не существует встроенного способа создания массива и создания в нем всех элементов, поэтому он не будет даже близок к тому, насколько просто вы хотели бы этого. Это будет такая же работа, какая есть на самом деле.

Вы можете создать метод для создания массива и всех объектов в нем:

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

Затем вы можете использовать это для создания массива с тремя уровнями:

 int[][][] count = CreateArray(10, () => CreateArray(10, () => new int[10])); 

Трехмерный массив кажется хорошим примером для создания собственного classа. Быть объектно ориентированным может быть красивым.

Нет более «более элегантного» способа, чем запись 2-х-петель. Вот почему они называются «зубчатыми», размеры каждого поддиапазона могут варьироваться.

Но это оставляет вопрос: почему бы не использовать версию [,,]?

 int[][][] count = Array.ConvertAll(new bool[10], x => Array.ConvertAll(new bool[10], y => new int[10])); 

Вы можете использовать dataset с идентичными данными. Это может вести себя как 3D-объект (xyz = строка, столбец, таблица) … Но у вас будет что-то большое, независимо от того, что вы делаете; вам все равно придется учитывать 1000 предметов.

С небольшой помощью Linq

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

Это, конечно, не очень и, вероятно, не быстро, но это однострочный.