1

最初に次のコードを実行します

var list = new List<int> {1, 5, 0, 65, 2, 1, 0, 10};

            var ordered = list.OrderBy(i => ++i);

            foreach (var i in ordered)
            {
                Console.WriteLine(i);
            }

出力: 0 0 1 1 2 5 10 65

それから、

var list = new List<int> {1, 5, 0, 65, 2, 1, 0, 10};

            var ordered = list.OrderBy(i => --i);

            foreach (var i in ordered)
            {
                Console.WriteLine(i);
            }

出力: 前と同じ

私の質問は、なぜこれが起こるのですか??

4

3 に答える 3

10

私の質問は、なぜこれが起こるのですか??

2 番目のフォームは、実質的に次と同じです。

var ordered = list.OrderBy(i => i - 1);

... の値を取得しない限り、順序は変更されませんInt32.MinValue

ラムダ式のパラメーターの値を変更するという事実は無関係です。そのパラメーター値は後で事実上破棄されます。シーケンスの値は変更されません。-1 -1 0 0 1 4 9 64 の出力が必要な場合は、次を使用する必要があります。

var ordered = list.Select(i => i - 1).OrderBy(i => i);
于 2013-04-24T17:27:58.540 に答える
4

例の変数iは、リスト内のアイテムのエイリアスではありません。実際には、リスト内のそのアイテムの値のコピーです。そのコピーを変更しても、シーケンス自体のアイテムは変更されません。

設計上、LINQ 操作は、使用するデリゲートで副作用が発生しないようにする必要があることに注意してください。これらはシーケンスのクエリ用に設計されているため、シーケンス自体を変更するべきではありません。プログラミングの LINQ の "スタイル" では、代わりに、持っているリストに基づいた新しいシーケンスを作成する必要がありますが、各項目はわずかに変更されています。これは「投影」と呼ばれ、次のSelectメソッドを使用して行われます。

var newList = list.Select(i => i + 1)
    .OrderBy(i => i);
于 2013-04-24T17:29:11.577 に答える