Вопрос

У меня есть этот код

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 () .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top