Как я могу запустить индекс в ArrayList
в 1 вместо 0? Существует ли способ сделать это непосредственно в коде?
(Обратите внимание, что я прошу ArrayList
, поскольку простые массивы посмотрите Инициализацию массива на произвольном начальном значении индекса в c#),
Очевидный способ сделать это - обернуть ArrayList в вашей собственной реализации и вычесть 1 из индексатора во всех операциях, использующих индекс.
Фактически вы также можете объявить массив в .NET, который имеет произвольную нижнюю границу (Прокрутите вниз до раздела «Создание массивов с ненулевой нижней границей»).
С учетом сказанного, пожалуйста, не делайте этого в производственном коде. Важно быть последовательным.
Как показывают другие ответы, есть способы имитировать это, но нет прямого способа сделать это на C # или других часто используемых языках .NET. Цитата Эрика Ганнерсона :
CLR поддерживает такую конструкцию (у меня была трудная раз не использовать здесь термин "пародия" ...), но , насколько мне известно, нет ни одного языков, которые имеют встроенный синтаксис для {{ 1}} сделайте это.
Не знаю, так ли это до сих пор, но в какой-то момент Visual Basic позволял вам начинать индексы массивов с 1 с помощью Option Base 1
.
В C# ни одна из коллекций System.Collections не поддерживает этого, но вы всегда можете написать класс-обертку, который сделает перевод индексов за вас.
Однако, на самом деле, этого следует избегать. Option Base
в VB создавал больше проблем, чем решал, я полагаю, потому что он нарушал предположения и делал вещи более запутанными.
Ну, вы могли бы сделать свой собственный:
public class MyArrayList<T> extends ArrayList<T> {
public T get(int index) {
super.get(index - 1);
}
public void set(int index, T value) {
super.set(index - 1, value);
}
}
Но напрашивается вопрос: с какой стати вы будете беспокоиться?
Stuff getValueAtOneBasedIndex(ArrayList<Stuff> list, index) {
return list.get(index -1);
}