- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为即将到来的测试做一些自己的工作,发现这道题我无法理解。
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、3和5 整除的数字:
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 numbery
in div, wheres
is divisible byy
.
至于你的最后一部分,为什么在你将 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/
我是一名优秀的程序员,十分优秀!