Вопрос
У меня есть этот код
public class SomeClass<T>: IEnumerable<T>
{
public List<SomeClass<T>> MyList = new List<SomeClass<T>>();
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
}
Как я могу извлечь IEnumerator из MyList?
Спасибо StackoverFlower....
Решение
Этот:
public List<SomeClass<T>> MyList = new List<SomeClass<T>>();
Должно быть это:
public List<T> MyList = new List<T>();
тогда это должно работать:
public IEnumerator<T> Getenumerator ()
{
foreach (var item in MyList){
yield return item;}
}
Вы не можете иметь
List<SomeClass<T>>
для которого вы извлекаете перечислитель, поскольку вы указали в интерфейсе, что перечислитель будет возвращать перечисляемый элемент <T>
.Вы также можете изменить IEnumerable<T>
быть
IEnumerable<SomeClass<T>>
и измените перечислитель на
public IEnumerator<SomeClass<T>> Getenumerator ()
{
foreach (var item in MyList){
yield return item;}
}
Другие советы
Тривиальная опция: return MyList.GetEnumerator ()
.
Ответ Кевинса правильный , а ленивый (даже лучше). Если вы используете ответ Trodek, будет выброшено следующее исключение:
Cannot implicitly convert type `System.Collections.Generic.List<SomeClass<T>>.Enumerator' to `System.Collections.Generic.IEnumerator<T>'(CS0029)
Тем не менее я хочу добавить комментарий. Когда вы используете yield return , создается конечный автомат, который будет возвращать различные значения. Если вы собираетесь использовать вложенные структуры данных (например, деревья), то при использовании return return будет выделяться гораздо больше памяти, поскольку в каждой подструктуре будет создаваться отдельный конечный автомат.
Ну, это мои два цента!
Предполагая, что есть способ получить объект T из объекта SomeClass,
public IEnumerator<T> GetEnumerator()
{
return MyList.Select(ml => ml.GetT() /* operation to get T */).GetEnumerator();
}
Как дополнение к принятому ответу, если вы получили сообщение
MyNamespace.MyClass<T>' does not implement interface
member 'System.Collections.IEnumerable.GetEnumerator()'.
'WindowsFormsApplication1.SomeClass<T>.GetEnumerator()' cannot implement
'System.Collections.IEnumerable.GetEnumerator()' because it does not have
the matching return type of 'System.Collections.IEnumerator'.
Вам необходимо реализовать дополнительный метод GetEnumerator ()
:
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
IEnumerable < T >
реализует IEnumerable
, поэтому должны быть реализованы обе формы GetEnumerator ()
.