Skip to main content
 首页 » 编程设计

c#之Linq Take 通过集合做额外的传递

2024年02月06日33cyq1162

我试图更好地理解 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 

这就是为什么你会看到这条消息三次