Инициализация массива по произвольному стартовому индексу в c#
-
01-07-2019 - |
Вопрос
Возможно ли в c # инициализировать массив, например, в подиндексе 1?
Я работаю с Office interop, и каждое свойство представляет собой массив объектов, который начинается с 1 (я предполагаю, что изначально оно было запрограммировано в VB.NET ), и вы не можете изменить его, вы должны настроить весь массив, чтобы он принял изменения.
В качестве обходного пути я клонирую исходный массив, модифицирую его и устанавливаю как единое целое, когда закончу.
Но мне было интересно, возможно ли создать новый ненулевой массив на основе
Решение
Вы можете использовать Array.CreateInstance
.
Видишь Типы массивов в .NET
Другие советы
Можно сделать так, как вы просите, смотрите код ниже.
// Construct an array containing ints that has a length of 10 and a lower bound of 1
Array lowerBoundArray = Array.CreateInstance(typeof(int), new int[1] { 10 }, new int[1] { 1 });
// insert 1 into position 1
lowerBoundArray.SetValue(1, 1);
//insert 2 into position 2
lowerBoundArray.SetValue(2, 2);
// IndexOutOfRangeException the lower bound of the array
// is 1 and we are attempting to write into 0
lowerBoundArray.SetValue(1, 0);
Не просто.Но вы, конечно, можете написать свой собственный класс.У него был бы массив в качестве частной переменной, и пользователь думал бы, что его массив начинается с 1, но на самом деле он начинается с нуля, и вы вычитаете 1 из всех обращений к его массиву.
Вы можете написать свой собственный класс массива
Я не думаю, что возможно изменить начальный индекс массивов.
Я бы создал свой собственный массив, используя generics, и обрабатывал его внутри.
Просто сохраните const int с именем 'offset' со значением, равным единице, и всегда добавляйте это к своим индексам в вашем коде.
Я не думаю, что вы можете создавать ненулевые массивы на C #, но вы могли бы легко написать собственный класс-оболочку вокруг встроенных структур данных.Этот класс-оболочка будет содержать частный экземпляр требуемого вами типа массива;перегрузка оператора индексирования [] запрещена, но вы можете добавить индексатор в класс, чтобы он вел себя как индексируемый массив, см. здесь.Функция index, которую вы пишете, может затем добавить (или вычесть) 1 ко всем переданным индексам.
Затем вы могли бы использовать свой объект следующим образом, и он вел бы себя корректно:
myArrayObject[1]; //would return the zeroth element.
В VB6 вы могли бы изменить массив так, чтобы он начинался с 0 или 1, поэтому я думаю, что VBScript может сделать то же самое.Для C # это невозможно, но вы можете просто добавить нулевое значение в первое [0] и начать реальное значение с [1].Конечно, это немного опасно...