这两段代码有什么区别
本文关键字:代码 什么 区别 两段 | 更新日期: 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_1
、y_2
,...因此,在评估Where()
中的实际 lambda 时,每个 lamba 中y
的值都是不同的。