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

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

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

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

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

Массивы vb.net тоже начинаются с 0.

Joel Coehoorn 17.09.2008 17:10

Но вы можете создать их, если не хотите (новый массив (от 3 до 5) или что-то в этом роде)

juan 17.09.2008 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
2
15 039
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

Свойства требуют, чтобы массив начинался с 1, поэтому это не сработает.

juan 17.09.2008 17:12

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

Да, вы всегда можете сделать что угодно сами ... вопрос в том, можно ли это сделать с помощью синтаксиса C#

juan 17.09.2008 17:13
Ответ принят как подходящий

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

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

Я действительно хотел узнать, возможно ли это синтаксически, но это отличное решение

juan 17.09.2008 17:15

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

jordanbtucker 04.03.2016 08:09

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

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

Просто сохраните const int с именем «смещение» со значением, равным единице, и всегда добавляйте его к своим индексам в коде.

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

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

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

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

// 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: один блок полезного кода стоит тысячи ссылок нечитабельного кода о в прозе.

Peter Majeed 27.07.2012 21:38

любой способ ввести это как int [] вместо массива?

JJS 26.11.2015 01:27

Другие вопросы по теме