gpt4 book ai didi

使用 Where 子句的 C# 结果序列

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:41 26 4
gpt4 key购买 nike

我正在为即将到来的测试做一些自己的工作,发现这道题我无法理解。

int[] div = new int[]{2,3,5};
IEnumerable<int>seq = new int[]{10,15,20,25,30};

for(int i = 0; i<div.Length;i++){
int y = div[i];
seq = seq.Where(s => s%y == 0)
}
seq = seq.ToList();

我以为结果序列是 10 15 20 25 30 但实际答案是 30。

我尝试自己运行代码,发现当代码运行for循环时,序列并没有重置为原来的序列,而是保留了前一个div[i]创建的序列。

例如,当 i = 0 时,div[0] 为 2,因此 seq 会选择 10、20 和 30。

随着代码进行到 i = 1 和 div[1] = 3,它用于计算部分的序列仍然是 {10,20,30} 而不是 {10,15,20,25,30}。

谁能解释一下为什么?

当我像这样将 int y 移到 for 循环的外部时,

int[] div = new int[]{2,3,5};
IEnumerable<int>seq = new int[]{10,15,20,25,30};
int y;

for(int i = 0; i<div.Length;i++){
y = div[i];
seq = seq.Where(s => s%y == 0)
}
seq = seq.ToList();

它给出了我期待的答案。

任何帮助都会非常有帮助。

谢谢。

最佳答案

这是您最终得到的结果查询:

IEnumerable<int> seq = new int[]{10,15,20,25,30};
seq = seq
.Where(s => s%2 == 0)
.Where(s => s%3 == 0)
.Where(s => s%5 == 0);

因此,每个可被 2、35 整除的数字:

10 is not divisible by 3
15 is not divisible by 2
20 is not divisible by 3
25 is not divisible by 2
30 is divisible by 2 (15), 3 (10), and 5 (6)

所以 30 是唯一的结果。


现在,如果您想要查询:“我想要 seq 中的每个数字都可以被 2、3 5 整除”,那么您需要这样做不同。

你的代码会过滤每一步,只让任何适合的数字进入下一步,所以每个都会过滤,但你想要相反的,如果他们中的任何一个会说没问题,那么你想要这个号码。

要获取 or 表达式,代码如下:

seq.Where(s => div.Any(y => s % y == 0))

这给出了这个结果:

10
15
20
25
30

基本上这个查询说:

Any number s in seq, which for any number y in div, where s is divisible by y.


至于你的最后一部分,为什么在你将 y 移到循环之外后它发生了变化?

好吧,让我们看看实际上会发生什么。

当您在循环中使用 y 时,如第一个示例中所示,对于循环中的每次迭代,您可以将 y 视为“新的 y 仅用于此循环迭代”。

因此,您可以考虑生成此查询的正在执行的代码:

int y1 = 2;
int y2 = 3;
int y3 = 5;
seq = seq
.Where(s => s%y1 == 0)
.Where(s => s%y2 == 0)
.Where(s => s%y3 == 0);

但是,如果您将 y 变量移到循环之外,您将只有一个 y,您可以更改它,因此最终结果这是:

int y = 5; // the last number in the loop
seq = seq
.Where(s => s%y == 0)
.Where(s => s%y == 0)
.Where(s => s%y == 0);

它基本上检查每个数字是否可以被 5 整除,3 次

因此,虽然您说这会为您提供所需的结果,但它并没有您想要的。或者更确切地说,我假设它没有执行您想要的操作,因为您实际上没有描述您希望代码执行的操作。

以下是一些解释差异的链接:

关于使用 Where 子句的 C# 结果序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562119/

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