这两段代码有什么区别

本文关键字:代码 什么 区别 两段 | 更新日期: 2023-09-27 18:13:54

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

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();

第一个 seq 的最终值是 10,15,20,25,30,第二个是 30。我对int x;之间的区别有点困惑和int y = div[i];.有人可以向我解释一下吗?
谢谢!

这两段代码有什么区别

调用seq = seq.Where( s=> s%x ==0);不会迭代元素。它只创建一个封装迭代的IEnumarable,可以在 fututre 中迭代。

因此,如果您在循环之前声明x变量,则传入的 lambda Where()使用相同的变量。由于您在循环中更改其值,因此最终只会实际使用最后一个值。

而不是这样的表达:

seq.Where( s=> s % 2 == 0).Where( s=> s % 3 == 0).Where( s=> s % 5 == 0);

你会得到:

seq.Where( s=> s % 5 == 0).Where( s=> s % 5 == 0).Where( s=> s % 5 == 0);

结果是不同的,因为您在 LINQ 的 Where() 参数中使用了 lambda 表达式。Where() 中所有 lambda 的实际执行是在两个示例的最后一行执行的 - 执行.ToList()的行。查看 Lambda 表达式中的变量作用域

示例中的区别在于如何初始化x/y

在第一个示例中,变量只有一个内存插槽 x 无论foreach的迭代次数如何。x始终指向内存中的同一位置。因此,最后一行上只有一个x值,它等于div[2]

在第二个示例中,在循环的每次迭代中为y创建了单独的内存槽。当程序评估时,y指向的地址在foreach的每次迭代中都会更改。你可以把它想象成有多个y变量,如y_1y_2 ,...因此,在评估Where()中的实际 lambda 时,每个 lamba 中y的值都是不同的。