Я хотел бы знать, могу ли я предположить, что IEnumerator
я получаю от IList
(путем вызова метода GetEnumerator
из интерфейса IEnumerable
) предоставит мне элементы в порядке списка.Как следует вести перечисление .Net IList?
Как вы думаете?
Я хотел бы знать, могу ли я предположить, что IEnumerator
я получаю от IList
(путем вызова метода GetEnumerator
из интерфейса IEnumerable
) предоставит мне элементы в порядке списка.Как следует вести перечисление .Net IList?
Как вы думаете?
Вы не можете, поскольку IList является интерфейсом, а реализация может перечислять элементы в любом порядке. Например, я мог бы реализовать «WeirdList: IList» и перечислить элементы любым способом, в том числе недетерминированным. Если вы используете List (T), с другой стороны, он гарантирует перечисление элементов в том порядке, в котором они хранятся в списке.
Редактировать: Как уже отмечалось, большинство реализаций будут следовать семантике List (T). Хотя это было не то, что вы просили;)
Да, он будет делать именно это, для любой достойной реализации IList
как минимум. Хороший IList
должен всегда перечислять свои элементы в том же порядке, в котором индексируется список.
List<int> list = new List<int> { 1, 1, 2, 3, 5, 8 };
IEnumerator<int> enumtor = list.GetEnumerator();
while (enumtor.MoveNext())
{
Console.Write(enumtor.Current);
}
Отпечатки 112358
.
Существует в настоящее время способ гарантировать, что человек, который реализовал IList следовал этому принципу, есть некоторые примеры, в которых было бы целесообразно, чтобы не возвращать его в порядке. –
Нет гарантии, но это общепринятое предположение, и это * предположительно * является допустимым предположением. – Joren
Я согласен, что это должно быть правильное предположение, но опыт в том, что программисты иногда делают сумасшедшие вещи в своем коде :) –
Перечислитель должен предоставить вам доступ к объектам внутри списка относительно их положения в памяти, которое будет таким же, как с использованием индексатора списка, идущего от 0 до длины < 1 в цикле for.
Редактировать: Я отвечал конкретно в отношении классов .NET Framework, которые реализуют IList, если кто-либо другой реализует эти интерфейсы, их фактическая реализация может быть примерно чем угодно. Так что это зависит от исполнителя.
Это будет зависеть от реализации IList
+1 Большинство реализаций будут похожи, но было бы ошибкой писать код на основе этого факта. –
Я бы предостерег от кода, который пытается проверить семантику структур данных, которые имеют довольно жесткую и быструю семантику. Это нормально для ваших модульных тестов, чтобы убедиться, что MyListImpl соответствует тому, что подразумевает IList, но фактический производственный код не должен иметь этих проверок. – user7116