Linq采取额外的通过集合

时间:2014-10-30 14:58:24

标签: c# linq

我试图更好地理解linq中的函数组成,为此我编写了这样的代码:

var x = Enumerable.Range(1, 10);

var result = x.Select(AddFive)
              .Where(FilterEvens)
              .Take(1);

result.ToList(); 

AddFive和FilterEvens方法定义如下:

int AddFive(int n)
{
    Console.WriteLine("Adding five");
    return n+5;
}

bool FilterEvens(int n)
{
    Console.WriteLine("Filtering evens");
    return n%2 == 0;
}

如果我拿1并运行它,我会得到以下结果,这是我所期望的:

  

添加五个   过滤均衡

如果我尝试拿2或5,我得到:

  

添加五个   过滤均匀
  加五   过滤均匀
  加五   过滤均匀

  

添加五个   过滤均匀
  加五   过滤均匀
  加五   过滤均匀
  加五   过滤均匀
  加五   过滤均匀
  加五   过滤均匀
  加五   过滤均匀
  加五   过滤均匀
  加五   过滤均匀

换句话说,看起来Take比集合中的需求更进一步。这是一个错误吗? (我猜它不是。)如果不是,有什么理由可以用这种方式实现吗?

1 个答案:

答案 0 :(得分:4)

Take不会更进一步。它一直在迭代,直到它找到你想要的数量。因为你有一个过滤,并不是所有的数字都被返回,因为它们中的一些不满足条件。所以,你看到由Select投射的每个数字的消息并按Where.

过滤

例如,在Take(2)

的情况下
Select returns 6 to where - it's returned 
Select returns 7 to where - not returned
Select returns 8 to where - returned

这就是你三次看到这条消息的原因