gpt4 book ai didi

c# - LINQ Skip 仍然枚举跳过的项目

转载 作者:IT王子 更新时间:2023-10-29 04:34:17 27 4
gpt4 key购买 nike

在下面的测试中:

int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Func<int, int> boom = x => { Console.WriteLine(x); return x; };
var res = data.Select(boom).Skip(3).Take(4).ToList();
Console.WriteLine();
res.Select(boom).ToList();

结果是:

1
2
3
4
5
6
7

4
5
6
7

基本上,我观察到在这个例子中,Skip()Take() 工作得很好,Skip() 没有那么懒惰股份()。似乎 Skip() 仍然枚举跳过的项目,即使它没有返回它们。

如果我先执行 Take(),这同样适用。我最好的猜测是,它至少需要枚举第一个跳过或采取的步骤,以便了解下一个要转到哪里。

为什么会这样?

最佳答案

Skip()Take()两者都在 IEnumerable<> 上运行.

IEnumerable<>不支持向前跳过——它一次只能给你一个项目。考虑到这一点,您可以想到 Skip()更像是一个过滤器——它仍然涉及源序列中的所有项目,但它会过滤掉您告诉它的所有项目。重要的是,它会将他们过滤掉,使其无法到达下一个目标,而不是前面的目标。

所以,通过这样做:

data.Select(boom).Skip(3)

您正在执行 boom()在他们到达 Skip() 之前的每一项 过滤器。

如果您改为将其更改为此,它将在 Select 之前进行过滤你会调用boom()仅在其余项目上:

data.Skip(3).Take(4).Select(boom)

关于c# - LINQ Skip 仍然枚举跳过的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34058199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com