IEnumerator <t>实现</t>

时间:2009-10-21 19:45:32

标签: .net ienumerable

我有这个代码

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

5 个答案:

答案 0 :(得分:8)

此:

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

您拉取枚举器,因为您已在接口中指定枚举器将返回<T>的可枚举项。您也可以将IEnumerable<T>更改为

IEnumerable<SomeClass<T>>

并将枚举器更改为

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

答案 1 :(得分:1)

琐碎的选项是return MyList.GetEnumerator()

答案 2 :(得分:1)

Kevins的答案是正确是懒惰的(甚至更好)。如果您使用Trodek响应,将抛出以下异常:

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

尽管如此我想添加评论。当您使用 yield return 时,会生成一个状态机,它将返回不同的值。如果要使用yield返回将使用嵌套数据结构(例如树)将分配更多内存,因为将在每个子结构中创建不同的状态机。

嗯,那是我的两分钱!

答案 3 :(得分:1)

假设有一种方法可以从对象SomeClass中获取对象T,

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

答案 4 :(得分:0)

如果收到消息

,则作为已接受答案的补充
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<T>实施IEnumerable,因此必须实现两种形式的GetEnumerator()