Pergunta

Eu tenho um este código

public class SomeClass<T>: IEnumerable<T>
{
    public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

Como posso extrair um IEnumerator de MyList?

Graças StackoverFlower ....

Foi útil?

Solução

Este:

public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

Precisa ser este:

public List<T> MyList = new List<T>();

então, isso deve funcionar:

public IEnumerator<T> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

Você não pode ter um

List<SomeClass<T>>

que você puxar o enumerador para, porque você especificou na interface que o recenseador irá retornar um item enumerável de <T>. Você também pode alterar IEnumerable<T> ser

IEnumerable<SomeClass<T>>

e altere o enumerador para ser

public IEnumerator<SomeClass<T>> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

Outras dicas

A opção trivial seria return MyList.GetEnumerator().

Kevin resposta é a correta e é preguiçoso (ainda melhor). Se você usar resposta Trodek a seguinte exceção será lance:

Cannot implicitly convert type `System.Collections.Generic.List<SomeClass<T>>.Enumerator' to `System.Collections.Generic.IEnumerator<T>'(CS0029)

No entanto eu quero adicionar um comentário. Quando você usa yield return uma máquina de estado é gerada que será devolver os diferentes valores. Se você estiver indo para usar estruturas de dados aninhadas (árvores, por exemplo) utilizando retorno rendimento será alocando muito mais memória, porque uma máquina de estado diferente será criado em cada estrutura de sub.

Bem, esses são os meus dois centavos!

Assumindo que há uma maneira de obter um objeto T fora de um SomeClass objeto,

public IEnumerator<T> GetEnumerator()
{
    return MyList.Select(ml => ml.GetT() /* operation to get T */).GetEnumerator();
}

Como um add on para a resposta aceita, se você recebeu a mensagem

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'.

Você precisa implementar o método GetEnumerator() adicional:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

implementos IEnumerable<T> IEnumerable assim ambas as formas de GetEnumerator() deve ser implementada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top