迭代你自己的对象(简单方法......)

时间:2012-02-06 08:16:51

标签: c# oop

似乎我记得一个可以实现的接口基本上有一个必须返回IEnumerable对象的方法,并且实现此接口将允许您在对象上使用foreach。有人可以告诉我这个界面是什么,或者如果我对此错误记忆,请纠正我吗?

编辑:对不起伙计们,我刚刚意识到我在混合了两件事。我不认为我刚才要求的是什么,但是我(并且仍在)试图想到的是一个你可以实现的接口,而不是IList或IEnumerable(我忘了哪个),它有一个方法可以让你返回该类型的对象而不是实际实现IList(或IEnumerable?)接口。

所以...稍微不同的问题,但仍与我有关。

编辑:IListSource是我想到的。对于每个人都很难想到的问题。好吧,他们不可能都很好:)

5 个答案:

答案 0 :(得分:2)

IEnumerable<T> has one method to return an IEnumerator<T>

IEnumerator<T> has methods like MoveNext and Current

答案 1 :(得分:0)

具有GetEnumerator方法的IEnumerable(或通用等效词IEnumerable<T>),返回IEnumeratorIEnumerator<T>

当您实现该方法时,您可以在另一个集合上调用GetEnumerator(例如,您自己类中的列表),也可以使用iterator blocks执行更多自定义迭代。

如果您遇到任何需要做的问题,请发布更多详细信息,我们可以提供更多帮助。

答案 2 :(得分:0)

实现IEnumberable(通用IEnumberable<T>)的对象需要实现GetEnumerator。使用这种方法可以获得强列表IEnumerator,如果使用IEnumberable<T>方法,您将获得通用IEnumerator

IEnumerator提供了类似

的方法
  • MoveNext生成集合中的下一个项目
  • Reset将枚举数重置为其初始位置,该位置位于集合中的第一个元素之前。

使用它可以迭代集合。

答案 3 :(得分:0)

EInumerable<T>接口(和非泛型IEnumerable接口)用于使类可枚举。

您可以像这样实施IEnumerable<T>

public class MyClass : IEnumerable<Item> {

  public IEnumerator<Container<T>> GetEnumerator() {

    // here you return your items, for example by returning an enumerator:
    return someArray.GetEnumerator();

    // or by using yield return:
    for (int i = 0; i < 10; i++) {
      yield return new Item(i);
    }

  }

  // this is needed, because IEnumerable<T> inherits IEnumerable
  System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
    // uses the generic implementation
    return GetEnumerator();
  }

}

编辑:

foreach语句使用duck typing而不是IEnumerable<T>接口,因此您不需要实现接口以在foreach语句中使用类。您只需实施GetEnumerator方法。

答案 4 :(得分:0)

Iterator块允许您“生成T类型的返回”对象,而不是创建实现IEnumerable<T>的类型。例如:

IEnumerable<int> PrimesLessThanTen()
{
    yield return 2;
    yield return 3;
    yield return 5;
    yield return 7;
}

IEnumerable<byte> OddBytes()
{
    byte b = 1;
    do
    {
        yield return b;
        b += 2;
    } while (b != 1);
}