Инициализация массива по произвольному стартовому индексу в c#

StackOverflow https://stackoverflow.com/questions/82943

Вопрос

Возможно ли в 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].Конечно, это немного опасно...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top