我试图更好地理解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比集合中的需求更进一步。这是一个错误吗? (我猜它不是。)如果不是,有什么理由可以用这种方式实现吗?
答案 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
这就是你三次看到这条消息的原因