Рубрики
Без рубрики

Списки

В этой статье я буду использовать список как концепцию последовательности элементов, а не как конкретную реализацию… С тегами lang, csharp, java.

В этой статье я буду использовать список как понятие последовательности

Если мы возьмем 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”