将single()与yield结合起来的代码是否有意义?

时间:2013-05-21 06:13:11

标签: c# performance linq refactoring yield

我遇到了一个应该返回列表中预期的单个对象的代码,这段代码有一个迭代器块,它产生了找到的项目,我简化了以下示例中的情况:

private static void Methode_A()
{
    Console.Write("{0} ", NumberList(2, 8).Single());     
}

private static IEnumerable<int> NumberList(int min, int max)
{
    while (min < max)
        yield return min++;        
}

Single()yield组合在一起构建列表并断言它包含一个单独的元素是否有任何意义或是否有任何已知的好处?

1 个答案:

答案 0 :(得分:3)

其工作方式如下:

  1. 您致电NumberList(2, 8).Single()
  2. 执行流程首次进入while循环并返回第一个结果(2)。
  3. 执行流程在循环的第二次迭代中继续,并返回第二个元素(3)
  4. .Single方法立即抛出异常并停止执行,因为它预计枚举器中只包含一个元素
  5. 另一方面,如果你在这里打电话NumberList(2, 8).First()会发生什么:

    1. 执行流程首次进入while循环并返回第一个结果(2)。
    2. 执行流程不再在while循环中继续,因为已经返回了一个元素,并且此元素将是调用的结果