0

次のコード例があります。

    List<int> list = new List<int>();

    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(4);
    list.Add(5);
    list.Add(6);
    list.Add(7);

  list.OrderByDescending(n=>n).Reverse();

しかし、私がこれを使用するとき:

list.OrderByDescending(n=>n).Reverse();

望みの結果が得られません。

上記のステートメントの代わりに、私はこれを使用します:

list.Reverse();

望みの結果が得られます。

最初のステートメントを使用しても、必要な結果が得られない理由はありますか?

私は拡張機能を理解する上で何かが欠けていると思います。

前もって感謝します。

4

2 に答える 2

6

メソッドはそのlist.Reverse()場でリストを逆にするため、元のものlistが変更されます。

.OrderByDescending()拡張メソッドは新しいリスト (というよりはIEnumerable<T>) を生成し、元のリストはそのまま残しますlist

EDIT
両方のソート順で2つのリストを取得するには:

List<int> upList = list.OrderBy(n => n).ToList();
List<int> downList = list.OrderByDescending(n => n).ToList();
于 2012-12-20T10:11:04.270 に答える
2

編集Enumerable:したがって、問題は、拡張機能が元のコレクションを変更すると思うことのようです。いいえそうではありません。実際には、変数に割り当てる必要がある新しいものを返します。

IEnumerable<int> ordered = list.OrderByDescending(n => n);
foreach(int i in ordered)
    Console.WriteLine(i);

OrderByDescending明らかに欲しいものです。それで、なぜ後でそれを元に戻すのか理解できません。

したがって、これにより期待される結果が得られるはずです。

var ordered = list.OrderByDescending(n=> n);

これは「任意の」順序を返します。

list.Reverse()

sを追加した順序を逆にするだけなのでint。順序付けられた方法でそれらを追加した場合は、まったく順序付けする必要はありません。

一般に、シーケンスを順序付けたい場合はOrderByorを使用し、シーケンスを逆にしたい場合は、必ずしも順序ではないものを使用します (少なくとも混乱します)。OrderByDescendingReverse

于 2012-12-20T10:10:59.217 に答える