遍历自己的对象(简单的方法..)

本文关键字:方法 简单 自己的 对象 遍历 | 更新日期: 2023-09-27 18:23:41

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

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

所以。。。问题略有不同,但对我来说仍然一样重要。

编辑:IListSource是我一直在想的。抱歉大家考虑不周的问题。啊,好吧,它们不可能都是好的:)

遍历自己的对象(简单的方法..)

IEnumerable<T> has one method to return an IEnumerator<T>
IEnumerator<T> has methods like MoveNext and Current

它是IEnumerable(或等效的泛型IEnumerable<T>),它有一个GetEnumerator方法,返回IEnumeratorIEnumerator<T>

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

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

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语句使用的是鸭子类型,而不是IEnumerable<T>接口,因此您实际上不需要实现该接口来使用foreach语句中的类。您只需实现GetEnumerator方法。

实现IEnumberable(通用IEnumberable<T>)的对象需要实现GetEnumerator。使用该方法可以得到强类型的IEnumerator,在IEnumberable<T>使用方法的情况下,可以得到泛型的IEnumerator

IEnumerator提供类似的方法

  • 生成集合中下一个项目的MoveNext
  • Reset,它将枚举器重置到其初始位置,即集合中第一个元素之前的位置

使用它可以对集合进行迭代。

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);
}