我试图更好地理解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,我就会得到:
加五 滤波均数 加五 滤波均数 加五 滤波均数
和:
加五 滤波均数 加五 滤波均数 加五 滤波均数 加五 滤波均数 加五 滤波均数 加五 滤波均数 加五 滤波均数 加五 滤波均数 加五 滤波均数
换句话说,它看起来比它在集合中需要的更远。这是虫子吗?(我猜不是。)如果不是的话,有什么好的理由让它以这种方式实现呢?
发布于 2014-10-30 15:03:42
Take没有走得更远。它不断地迭代,直到找到与您的want.Since一样多的数字--有一个筛选,并不是所有的数字都被返回,因为其中一些数字不能满足condition.So,您可以看到由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这就是为什么你三次看到这个信息
https://stackoverflow.com/questions/26656371
复制相似问题