实现空迭代器

时间:2009-03-07 01:11:32

标签: c# refactoring iterator

我有这段代码:

    public IEnumerable<int> Iterator {
        get { if (false) yield return -1; }
    }

这是相当丑陋的,但当你试图将其重构为:

    public IEnumerable<int> Iterator {
        get { return null; }
    }

以下代码中断:

foreach (var item in obj.Iterator) {
}

你会如何清理它?

4 个答案:

答案 0 :(得分:10)

public IEnumerable<int> Iterator {
    get { yield break; }
}

答案 1 :(得分:6)

顺便说一句,.NET框架已经有了一种方法来完成这项工作(使Jared的代码变得多余):System.Enumerable.Empty<T>

答案 2 :(得分:2)

更好的解决方案是为此问题定义可重用的方法。我在共享库中保留了一个方法来处理这种情况。

public static class CollectionUtility { 
  public static IEnumerable<T> CreateEmptyEnumerable<T>() {
    yield break;
  }
}

现在在你的方法中你可以打电话

public static IEnumerable<int> Iterator { 
  get { return CollectionUtility.CreateEmptyEnumerable<int>(); }
}

答案 3 :(得分:0)

  public IEnumerable<int> Iterator {
        get { yield break; }
    }