Инициализация массива по произвольному начальному индексу в c # - PullRequest
6 голосов
/ 17 сентября 2008

Возможно ли в c # инициализировать массив, например, с субиндексом 1?

Я работаю с взаимодействием Office, и каждое свойство представляет собой массив объектов, который начинается с 1 (я предполагаю, что он изначально был запрограммирован в VB.NET), и вы не можете изменить его, для него нужно установить весь массив принять изменения.

В качестве обходного пути я клонирую исходный массив, изменяю его и устанавливаю его целиком, когда закончу.

Но мне было интересно, возможно ли создать новый ненулевой массив

Ответы [ 8 ]

18 голосов
/ 17 сентября 2008

Можно сделать так, как вы просите, см. Код ниже.

// 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);
7 голосов
/ 17 сентября 2008

Вы можете использовать Array.CreateInstance.

См. Типы массивов в .NET

1 голос
/ 17 сентября 2008

Не просто. Но вы, конечно, можете написать свой собственный класс. Он будет иметь массив как частную переменную, и пользователь будет думать, что его массив начинается с 1, но на самом деле он начинается с нуля, а вы вычитаете 1 из всех его обращений к массиву.

0 голосов
/ 17 сентября 2008

Я не думаю, что вы можете создавать ненулевые массивы в C #, но вы можете легко написать собственный класс-оболочку для встроенных структур данных. Этот класс-оболочка будет содержать частный экземпляр типа массива, который вы требуется; Перегрузка оператора индексации [] недопустима, но вы можете добавить индексатор к классу, чтобы он вел себя как индексируемый массив, см. здесь . Функция индексирования, которую вы пишете, может затем добавить (или вычесть) 1 ко всем переданным индексам.

Затем вы можете использовать свой объект следующим образом, и он будет вести себя правильно:

myArrayObject[1]; //would return the zeroth element.
0 голосов
/ 17 сентября 2008

Просто сохраните const int с именем offset, равным единице, и всегда добавляйте это к своим подписчикам в своем коде.

0 голосов
/ 17 сентября 2008

Не думаю, что возможно изменить начальный индекс массивов.

Я бы создал свой собственный массив с использованием шаблонов и обработал бы его внутри.

0 голосов
/ 17 сентября 2008

В VB6 вы можете изменить массив на 0 или 1, поэтому я думаю, что VBScript может делать то же самое. Для C # это невозможно, но вы можете просто добавить значение NULL в первом [0] и начать действительное значение в [1]. Конечно, это немного опасно ...

0 голосов
/ 17 сентября 2008

Вы можете написать свой собственный класс массива

...