2008-09-17 1 views
6

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

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

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

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

+1

Ресурсы vb.net начинаются с 0, тоже. – 2008-09-17 13:10:57

+0

Но вы можете создать их, если хотите, чтобы они не были (новый массив (от 3 до 5) или что-то в этом роде) – juan 2008-09-17 13:11:53

ответ

0

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

-1

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

+0

Свойства требуют, чтобы массив начинался с 1, так что это не сработало – juan 2008-09-17 13:12:55

1

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

+1

Да, вы всегда можете что-либо сделать самостоятельно ... вопрос в том, можно ли это сделать с синтаксисом C# – juan 2008-09-17 13:13:40

0

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

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

0

Просто сохраните const int с именем «offset» со значением один и всегда добавляйте это к вашим индексам в вашем коде.

0

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

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

myArrayObject[1]; //would return the zeroth element. 
17

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

// 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); 
Смежные вопросы