IEnumerable и порядок



У меня есть вопрос о порядке в IEnumerable (или IEnumerable<T>, не имеет значения).



Как известно, перебор IEnumerable-это псевдокод, который может быть записан следующим образом:



while (enumerable.HasNext())
{
object obj = enumerable.Current;
...
}


Теперь предположим, что нужно оперировать сотсортированной коллекцией. Можно ли в этом случае использовать IEnumerable или лучше попробовать другие средства (например, IList) с поддержкой индексации?

Другими словами: дает ли контракт IEnumerable какие-либо гарантии относительно порядок вообще?

UPD : Таким образом, IEnumerable не является надлежащим средством для универсального интерфейса, гарантирующего упорядочение. Новый вопрос заключается в том, какой интерфейс или класс следует использовать для неизменяемой коллекции с порядком? ReadonlyCollection? IList? Оба они содержат метод Add() (даже не реализованный в первом.) Есть предложения?



P. S мои собственные мысли: IEnumerable не дает никаких гарантий по поводу заказа. Правильная реализация может вернуть те же элементы в разный порядок в разных перечислениях (рассмотрим SQL-запрос)



Я знаю о LINQ First(), но если IEnumerable не говорит ни слова о его упорядочивании, это расширение довольно бесполезно.
612   4  

4 ответов:

IEnumerable/IEnumerable<T> не дает никаких гарантий относительно порядка, но реализации, использующие IEnumerable/IEnumerable<T>, могут гарантировать или не гарантировать порядок.

Например, если вы перечисляете List<T>, Порядок гарантируется, но если вы перечисляете HashSet<T>, такая гарантия не предоставляется, но оба будут перечислены с помощью интерфейса IEnumerable<T>.

Детали реализации. IEnumerable перечислит пункт-как это будет реализовано, зависит от реализации. Большинство списков и т.д. бегите по их естественному порядку (индекс 0 вверх и т. д.).

Гарантирует ли нам контракт IEnumerable некоторый порядок в общем случае?

Нет, он гарантирует только перечисление (каждый элемент один раз и т. д.). IEnumerable не имеет гарантированного порядка, потому что он также может использоваться для неупорядоченных элементов.

Я знаю о LINQ First (), но если IEnumerable не говорит ни слова о его порядке, это расширение довольно бесполезно.

Нет, это не так, потому что у вас может быть внутренний порядок. Вы приводите SQL в качестве примера-результат является IEnumerable, но если я принудительно упорядочивал раньше (с помощью OrderBy ()), то IEnumerable упорядочивается по определению LINQ. Методом asenumerable().First() получает мне тогда первый предмет по заказу.

Возможно, вы ищете интерфейс IOrderedEnumerable? Он возвращается методами расширений, такими как OrderBy() и допускает последующую сортировку с помощью ThenBy().

Вы смешиваете два момента: перечисление и упорядочивание.

Когда вы перечисляете через IEnumerable, вы не должны заботиться о порядке. Вы работаете с интерфейсом, и его реализация должна заботиться о порядке.

Например:

void Enumerate(IEnumerable sequence)
{
    // loop
}

SortedList<T> sortedList = ...
Enumerate (sortedList);

Внутри метода это все еще список с фиксированным порядком, но метод не знает о конкретной реализации интерфейса, и это особенность.

Comments

    Ничего не найдено.