ジェネリックリストのDESCおよびASCを並べ替える方法を教えてください。


110

ジェネリックリストのDESCおよびASCを並べ替える方法を教えてください。LINQを使用してLINQを使用せずに?VS2008を使用しています。

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}

回答:


246

Linqを使用

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Linqなし

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Linqがないと、リスト自体がソートされていることに注意してください。Linqを使用すると、リストの順序付き列挙型を取得できますが、リスト自体は変更されていません。リストを変更したい場合は、Linqメソッドを次のように変更します。

li = li.OrderBy(i => i).ToList();

1
@onedaywhen別のユーザーの回答が正しくないと思われる場合は、コメント、投票、または正しいと思う回答を提供する必要があります。別のユーザーの回答を正しいと思うように編集しないでください。
サービー2015

24
降順のli.Sort((a, b) => b.CompareTo(a));場合、-1*ここで使用する方法よりも使用する方がはるかに明確だと思います。私はそれに応じて回答を編集しましたが、@ Servyはそれを元に戻しました。
2015年

9
@onedaywhen著者が意図した内容を書き間違えた場合、それを意図した内容に変更しても問題ありません。代わりに使用する必要があると感じる別のアプローチを使用するための解決策であると誰かが考えたコード形式の変更は、適切な編集ではありません。
サービー2015年

5
@onedaywhen確かに; 編集の説明が表示されているところならどこでも見ることができます。ヘルプセンターから、「いつ投稿を編集する必要がありますか?[...]投稿の意味を(意味を変更せずに)明確にするために」
Servy

4
または単に-a.CompareTo(b)
Shimmy Weitzhandler 2017

72

Linqなし:

上昇:

li.Sort();

降順:

li.Sort();
li.Reverse();

Sort()voidメソッドであるためReverse()、この方法でにチェーンすることはできません。2つの別々の操作が必要になります。ただし、LINQを使用すると、それをにチェーンできますOrderByが、その時点ではOrderByDescending代わりに使用する必要があります。
Ahmad Mageed 2010年


3

上記のすべての答えをチェックしていて、もう1つ情報を追加したいと思いました。リストをDESC順にソートしたかったので、大きな入力に対してより高速なソリューションを探していましたが、この方法を以前に使用していました:-

li.Sort();
li.Reverse();

しかし、私のテストケースは時間制限を超えたため失敗しました。

li.Sort((a, b) => b.CompareTo(a));

つまり、最終的には、リストを降順でソートする2番目の方法は、前の方法よりも少し速いという結論になります。


-3

int値を含むリストを降順で並べ替える非常に簡単な方法:

li.Sort((a,b)=> b-a);

これがお役に立てば幸いです!


4
これはint.CompareTo(int)、理由を説明するものではありません。参照してくださいreferencesource.microsoft.comでソースを「:言いたなど、減算は非常に大きなNEG番号についてはポジティブに折り返されますので、使用する必要がありますが、比較します」。あなたが持っている場合b = int.MinValuea = 1(言って)、これは失敗します。時々、メソッド呼び出しはそれだけの価値があります。
Wai Ha Lee

一般的なリストの並べ替えについて質問します。"-"オペレーションは、多くのタイプでコンパイルできません。コンパイルされた型のセットの場合、前のコメントで述べたように数値オーバーフローエラーが発生する可能性があります
Vadim Levkovsky
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.