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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top