我试图更好地理解 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 并运行它,我会得到以下结果,这正是我所期望的:
Adding five
Filtering evens
如果我尝试取 2 或 5,我会得到:
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
和:
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
Adding five
Filtering evens
换句话说,看起来 Take 在系列中走得比它需要的更远。这是一个错误吗? (我猜不是。)如果不是,那么以这种方式实现是否有充分的理由?
请您参考如下方法:
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
这就是为什么你会看到这条消息三次
