在c#中可以使用多个迭代器吗?

时间:2009-11-18 06:27:20

标签: c#-3.0

可以在c#.net中使用多个迭代器(对于单个类或对象)吗?如果是给我一些简单的例子。对不起,如果问题不明白,请告诉我。

3 个答案:

答案 0 :(得分:7)

您当然可以创建不同的迭代器以不同的方式遍历。例如,您可以:

public class Tree<T>
{
    public IEnumerable<T> IterateDepthFirst()
    {
        // Iterate, using yield return
        ...
    }

    public IEnumerable<T> IterateBreadthFirst()
    {
        // Iterate, using yield return
        ...
    }
}

这是你问的那种事吗?

可能会写:

public class Foo : IEnumerable<int>, IEnumerable<string>

但这会导致很多混淆,而foreach循环会选择任何一个未明确实现GetEnumerator调用的循环。

你可以同时同时在同一个集合上多次迭代:

foreach (Person person1 in party)
{
    foreach (Person person2 in party)
    {
        if (person1 != person2)
        {
            person1.SayHello(person2);
        }
    }
}

答案 1 :(得分:1)

如果你的意思是你可以为一个类实现多个迭代器,或者你是否可以一次为一个类使用多个迭代器,那就不是很清楚了。两种都是可能的。

您可以为类创建任意数量的迭代器:

public class OddEvenList<T> : List<T> {

  public IEnumerable<T> GetOddEnumerator() {
    return this.Where((x, i) => i % 2 == 0);
  }

  public IEnumerable<T> GetEvenEnumerator() {
    return this.Where((x, i) => i % 2 == 1);
  }

}

对于同时处于活动状态的类,您可以拥有尽可能多的迭代器实例:

foreach (int x in list) {
  foreach (int y in list) {
    foreach (int z in list) {
      ...
    }
  }
}

答案 2 :(得分:0)

一种选择是实施战略模式:

  1. 为每个遍历策略创建单独的IEnumerator类。
  2. 在集合中创建一个私有属性,用于存储当前策略(使用默认值)。
  3. 创建一个SetStrategy方法,将该私有属性更改为所选的具体策略。
  4. 覆盖GetEnumerator以返回当前策略的实例。
  5. 当然,这意味着两个尝试同时设置策略的线程可能会产生干扰,因此如果在线程之间共享集合很重要,那么这不是最佳解决方案。

    一个直接的迭代器模式也可以工作,这就是我相信Jon Skeet在他的第一个例子中提出的建议,但你失去了能够使用foreach的语法糖。