Обеспечивает ли IEnumerator .Net IList порядок списка?
-
13-09-2019 - |
Вопрос
Могу ли я предположить, что IEnumerator
я получаю от IList
(позвонив в GetEnumerator
метод из IEnumerable
интерфейс) предоставит мне элементы в порядке списка?
Решение
Это невозможно, поскольку IList — это интерфейс, а реализация может перечислять элементы в любом порядке.Например, я мог бы реализовать WeirdList:IList и заставить его перечислять элементы любым способом, в том числе недетерминированным.С другой стороны, если вы используете List(T), он гарантирует перечисление элементов в том порядке, в котором они хранятся в списке.
Редактировать:При этом, как отмечают многие другие, большинство реализаций будут следовать семантике List(T).Хотя вы не об этом спрашивали ;)
Другие советы
Перечислитель должен предоставлять вам доступ к объектам внутри списка относительно их положения в памяти, что будет то же самое, что использование индексатора списка от 0 до длины <1 в цикле for.
Редактировать: Я ответил конкретно в отношении классов .NET Framework, которые реализуют IList. Если кто-то другой реализует эти интерфейсы, их фактическая реализация может быть чем угодно.Так что это зависит от исполнителя.
Да, именно это и будет сделано для любой достойной реализации 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