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 ....
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 ??strong> 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.