IEnumerator < T > Implementazione
-
05-07-2019 - |
Domanda
Ho questo codice
public class SomeClass<T>: IEnumerable<T>
{
public List<SomeClass<T>> MyList = new List<SomeClass<T>>();
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
}
Come posso estrarre un IEnumerator da MyList?
Grazie StackoverFlower ....
Soluzione
Questa:
public List<SomeClass<T>> MyList = new List<SomeClass<T>>();
Deve essere questo:
public List<T> MyList = new List<T>();
quindi, dovrebbe funzionare:
public IEnumerator<T> Getenumerator ()
{
foreach (var item in MyList){
yield return item;}
}
Non puoi avere un
List<SomeClass<T>>
per cui si tira l'enumeratore, poiché nell'interfaccia è stato specificato che l'enumeratore restituirà un elemento enumerabile di < T >
. Puoi anche modificare IEnumerable < T >
in
IEnumerable<SomeClass<T>>
e modifica l'Enumeratore in
public IEnumerator<SomeClass<T>> Getenumerator ()
{
foreach (var item in MyList){
yield return item;}
}
Altri suggerimenti
L'opzione banale sarebbe return MyList.GetEnumerator ()
.
La risposta di Kevins è la corretta e è pigra (anche meglio). Se si utilizza la risposta Trodek, verrà generata la seguente eccezione:
Cannot implicitly convert type `System.Collections.Generic.List<SomeClass<T>>.Enumerator' to `System.Collections.Generic.IEnumerator<T>'(CS0029)
Tuttavia, voglio aggiungere un commento. Quando si utilizza rendimento> viene generata una macchina a stati che restituirà i diversi valori. Se si utilizzano strutture di dati nidificati (ad esempio alberi) utilizzando il rendimento, verrà allocata molta più memoria perché verrà creata una macchina a stati diversa in ogni sottostruttura.
Bene, quelli sono i miei due centesimi!
Supponendo che esista un modo per estrarre un oggetto T da un oggetto SomeClass,
public IEnumerator<T> GetEnumerator()
{
return MyList.Select(ml => ml.GetT() /* operation to get T */).GetEnumerator();
}
Come aggiunta alla risposta accettata, se hai ricevuto il messaggio
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'.
Devi implementare il metodo GetEnumerator ()
aggiuntivo:
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
IEnumerable < T >
implementa IEnumerable
, quindi entrambe le forme di GetEnumerator ()
devono essere implementate.