0

我正在查看这个 eratosthenes 筛子的代码,但我仍然无法理解“i”变量是如何增加的,因为我对 lambda 表达式的了解有限,并且文档对我没有多大帮助。谁能解释一下?

int cur = 1, total = 1000;
var pc = Enumerable.Range(2, total).ToList();

while(cur <= Math.Sqrt(total))
{
    cur = pc.First(i => i > cur);
    pc.RemoveAll(i => i != cur && i % cur == 0);
}

Console.WriteLine(pc.Max()); 
4

4 回答 4

3

它实际上并没有增加。在此代码中的两个 lambda 表达式中,i都用作当前处理值的临时占位符。即,

cur = pc.First(i => i > cur);

表示“取第一个大于from 的并将其分配给”。curpccur

pc.RemoveAll(i => i != cur && i % cur == 0);

意思是“取所有不等于并且除以零提示的并将它们从 pc 中删除”。curcur

于 2012-06-30T13:09:54.250 回答
0

变量 cur 在 while 循环中更新:

cur = pc.First(i => i > cur); 

i 只是返回第一次出现 i > cur 的谓词的一部分。换句话说,在这些情况下,它是一个局部变量。

于 2012-06-30T13:08:50.003 回答
0

它不是 i 而是 cur 变量,它控制何时退出循环

于 2012-06-30T13:12:27.670 回答
0

它不会增加,它依赖于 pc 删除成员,直到不满足 while 条件。

把它想象成两者之间的区别

index = 1000;
while (index > 0)
{
    pc.Remove(index);
    index--;
}

while (pc.Count > 0)
{
   pc.Remove(0);
}
于 2012-06-30T13:15:10.930 回答