0

エラトステネスのふるいのこのコードを見ていましたが、ラムダ式に関する知識が限られており、ドキュメントがあまり役に立たなかったため、「i」変数がどのようにインクリメントされるかをまだ理解できませんでした。誰でも説明できますか?

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

実際にはインクリメントされません。このコードの両方のラムダ式でi、現在処理されている値の一時的なプレースホルダーとして使用されます。すなわち、

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

は、「 fromより大きい最初の値を取り、それを to に代入する」ことを意味します。curpccur

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

「等しくないすべての値をcur取り、除算からゼロリマインダを持ちcur、それらをpcから削除する」ことを意味します。

于 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

それはインクリメントされません.while条件が満たされないまでメンバーが削除されているPCに依存しています.

の違いのように考えてください。

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

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