В этой статье я буду использовать список как понятие последовательности
Если мы возьмем C # в качестве отправной точки, конкретные реализации будут:
- Список
- Массив
- Список массивов
- Связанный список
Общая концепция списка в C# – это IEnumerable . Объекты, реализующие это, могут использоваться там, где требуется обработка списка.
Обратите внимание, что не все примеры кода допустимы, это поможет мне сосредоточиться. Используйте связанную документацию, чтобы получить правильную реализацию.
// C# public class MyList : IEnumerable { IEnumerator IEnumerable.GetEnumerator() { return new MyListEnumerator(...); } } public class MyListEnumerator : IEnumerator { public bool MoveNext() { ... } public void Reset() { ... } object IEnumerator.Current { ... } }
Фактическая итерация обрабатывается IEnumerator, которому необходимо указать, что нужно повторять.
Java вызывает их Iterable
public class MyList : Iterable { Iterator iterator() { return new MyListEnumerator(...); } } public class MyListEnumerator : Iterator { public boolean hasNext() { ... } Object next() { ... } }
Подобный
- определите, есть ли элементы
- получить элемент
Разница
- продвижение происходит либо при получении элемента, либо при определении того, выполняется ли итерация должен остановиться
В D это называется диапазоном
public struct MyList Enumerator { bool empty() {...} Object front() {...} void popFront() {...} }
Подобный
- определите, есть ли элементы
- получить элемент
Разница
- продвижение является отдельным и не является частью других операций
Теперь я могу сказать вам по опыту, что для получения текущего элемента может потребоваться временное хранилище из-за базового контейнера или тяжелых вычислений.
Также может показаться, что D обманывает, как в Java, так и в C# определены два класса: контейнер, а затем итератор. D действительно имеет концепцию контейнера, однако для каждого
не работает на этом уровне, ожидается, что для разрезания контейнера, чтобы получить его диапазон. Это уменьшает накладные расходы на цепочку диапазонов, в то время как перечисляемый должен содержать, а затем перечислять.
Оригинал: “https://dev.to/jessekphillips/lists-3jm2”