C# 3.0 在c#中是否可以使用多个迭代器?

C# 3.0 在c#中是否可以使用多个迭代器?,c#-3.0,C# 3.0,在c#.net中是否可以使用多个迭代器(针对单个类或对象)?如果是,请给我一些简单的例子。对不起,如果这个问题不可理解,请让我说清楚 您当然可以创建不同的迭代器以不同的方式进行遍历。例如,您可以: public class Tree<T> { public IEnumerable<T> IterateDepthFirst() { // Iterate, using yield return ... } pu

在c#.net中是否可以使用多个迭代器(针对单个类或对象)?如果是,请给我一些简单的例子。对不起,如果这个问题不可理解,请让我说清楚

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

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

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

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

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

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

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

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


    直接迭代器模式也可以工作,这是我相信Jon Skeet在他的第一个示例中所建议的,但是您失去了能够使用foreach的语法优势。

    一个选项是实现策略模式:

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


    直接迭代器模式也可以工作,这是我相信Jon Skeet在他的第一个示例中所建议的,但是您失去了能够使用foreach的语法优势。

    不太清楚您的意思是可以为一个类实现多个迭代器,还是一次可以为一个类使用多个迭代器。两者皆有可能

    一个类可以有任意多个迭代器:

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

    还不清楚您的意思是可以为一个类实现多个迭代器,还是一次可以为一个类使用多个迭代器。两者皆有可能

    一个类可以有任意多个迭代器:

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

    如果它们都是显式实现的,会发生什么情况?@Matthew:那么foreach根本不起作用,除非您将目标转换为其中一个接口,此时它将知道调用哪个接口。这是我的信念,无论如何:)所以我们不能让两个GetEnumerator将winthin称为类。是这样吗?@Babu:你必须使用显式接口实现。@Jon Skeet:查看我的下一篇文章。并评论我。如果它们都显式实现了,会发生什么事?@Matthew:那么foreach根本无法工作,除非你将目标转换为其中一个接口,在这一点上,它会知道该呼叫哪个。这就是我的信念:)所以我们不能让两个GetEnumerator调用winthin作为一个类。对吗?@Babu:你必须使用显式接口实现。@Jon Skeet:查看我的下一篇文章。并评论我。@richardtallent:你没有使用foreach的能力。例如,您只需使用“foreach(tree.IterateDepthFirst()中的字符串x)”。@richardtallent:您没有使用foreach的功能。例如,您只需使用“foreach(tree.IterateDepthFirst()中的字符串x)”。
    foreach (int x in list) {
      foreach (int y in list) {
        foreach (int z in list) {
          ...
        }
      }
    }