Знаком с C# только по наслышке, так что задаю вопрос скорее от любопытства, чем от реальной необходимости получить ответ. Интересует причина, по которой в классе List крайне странно поддерживаются энумераторы. Например, я не смог найти метода, удаляющего элемент списка по энумератору. Вообще, поддержка энумераторов кажется какой-то фрагментированной. И главное, что я не могу понять - это то, почему по умолчанию (например,
тут) предлагается использовать список, доступ к которому по всем канонам
должен быть итерированным, не только по моему скромному мнению, как структуру с произвольным, индексированным доступом.
А вот пример, который наглядно показывает, что итераторы в C# реализованы не просто не полностью, а крайне криво.
Код на Си++, в котором показана правильная работа списка. Компилируется и работает, как и задумано:
#include <list>
#include <iostream>
int main ()
{
std::list<int> lol;
std::list<int>::iterator ptr, ptr2;
lol.push_back(1);
lol.push_back(2);
lol.push_back(3);
ptr = ptr2 = lol.begin();
lol.erase(++ptr2);
std::cout << *(++ptr) << std::endl;
return 0;
}
А вот пример точно такого же использования (корректного с точки зрения того, что вообще такое "список"), но непременно падающего в случае использования шарповых списков и энумераторов.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EnumeratorTest
{
class Program
{
static int Main(string[] args)
{
List<int> lol = new List<int>();
List<int>.Enumerator ptr;
lol.Add(1);
lol.Add(2);
lol.Add(3);
ptr = lol.GetEnumerator();
lol.RemoveAt(1);
if (ptr.MoveNext())
System.Console.Out.WriteLine(ptr.Current);
return 0;
}
}
}
Я вот не могу понять, то ли это я в чем-то ошибаюсь, то ли всем приятно следить за тем, куда убегают индексы элементов при вставках и удалениях элементов списка (крайне частые операции над списками, не правда ли?), то ли я вообще ничего не понимаю. Нет, то есть я понимаю, что разработчики стандартной библиотеки не дураки, и что я, скорее всего, в чем-то заблуждаюсь. Но как-то мне это не очевидно.
Помогите, пожалуйста, разобраться. Заранее спасибо.