Как я могу создать ArrayList с начальным значением индекса 1 (вместо 0)

Как я могу запустить индекс в ArrayList в 1 вместо 0? Существует ли способ сделать это непосредственно в коде?

(Обратите внимание, что я прошу ArrayList, поскольку простые массивы посмотрите Инициализацию массива на произвольном начальном значении индекса в c#),

10
задан Community 23 May 2017 в 10:27
поделиться

5 ответов

Очевидный способ сделать это - обернуть ArrayList в вашей собственной реализации и вычесть 1 из индексатора во всех операциях, использующих индекс.

Фактически вы также можете объявить массив в .NET, который имеет произвольную нижнюю границу (Прокрутите вниз до раздела «Создание массивов с ненулевой нижней границей»).

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

19
ответ дан 3 December 2019 в 14:18
поделиться

Как показывают другие ответы, есть способы имитировать это, но нет прямого способа сделать это на C # или других часто используемых языках .NET. Цитата Эрика Ганнерсона :

CLR поддерживает такую ​​конструкцию (у меня была трудная раз не использовать здесь термин "пародия" ...), но , насколько мне известно, нет ни одного языков, которые имеют встроенный синтаксис для {{ 1}} сделайте это.

1
ответ дан 3 December 2019 в 14:18
поделиться

Не знаю, так ли это до сих пор, но в какой-то момент Visual Basic позволял вам начинать индексы массивов с 1 с помощью Option Base 1.

В C# ни одна из коллекций System.Collections не поддерживает этого, но вы всегда можете написать класс-обертку, который сделает перевод индексов за вас.

Однако, на самом деле, этого следует избегать. Option Base в VB создавал больше проблем, чем решал, я полагаю, потому что он нарушал предположения и делал вещи более запутанными.

2
ответ дан 3 December 2019 в 14:18
поделиться

Ну, вы могли бы сделать свой собственный:

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);
    }
}

Но напрашивается вопрос: с какой стати вы будете беспокоиться?

4
ответ дан 3 December 2019 в 14:18
поделиться
Stuff getValueAtOneBasedIndex(ArrayList<Stuff> list, index) {
     return list.get(index -1);
}
1
ответ дан 3 December 2019 в 14:18
поделиться