質問
このコードを持っています
public class SomeClass<T>: IEnumerable<T>
{
public List<SomeClass<T>> MyList = new List<SomeClass<T>>();
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
}
MyListからIEnumeratorを抽出するにはどうすればよいですか
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>>
列挙子が&lt; T&gt;
の列挙可能な項目を返すことをインターフェイスで指定したため、列挙子をプルする。 IEnumerable&lt; T&gt;
を次のように変更することもできます
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 を使用すると、さまざまな値を返すステートマシンが生成されます。ネストされたデータ構造(ツリーなど)を使用する場合、yield returnを使用すると、すべてのサブ構造に異なるステートマシンが作成されるため、より多くのメモリが割り当てられます。
まあ、それらは私の2セントです!
オブジェクトSomeClassからオブジェクトTを取得する方法があると仮定すると、
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&lt; T&gt;
は IEnumerable
を実装しているため、 GetEnumerator()
の両方の形式を実装する必要があります。
所属していません StackOverflow