web-dev-qa-db-ja.com

リストをアルファベット順に並べ替える

次のクラスがあります。

class Detail
{
    public Detail()
    {
        _details = new List<string>();
    }
    public IList<string> Details { get { return _details; } }
    private readonly List<string> _details;
}

現在、以下を使用してクラスをランダムにソートします。

void ShuffleGenericList<T>(IList<T> list)
{
    //generate a Random instance
    var rnd = new Random();
    //get the count of items in the list
    var i = list.Count();
    //do we have a reference type or a value type
    T val = default(T);

    //we will loop through the list backwards
    while (i >= 1)
    {
        //decrement our counter
        i--;
        //grab the next random item from the list
        var nextIndex = rnd.Next(i, list.Count());
        val = list[nextIndex];
        //start swapping values
        list[nextIndex] = list[i];
        list[i] = val;
    }
}

私がやりたいのは、詳細の内容をアルファベット順にソートすることです。

たとえば、コンテンツが次のようになっている場合:

[0] a
[1] d
[2] b

このメソッドを実行し、それらをソートできるようにしたい:

[0] a
[1] b
[2] d

誰でもこれを行う簡単な方法を知っていますか?通常、リストのエントリは10個未満です。 LINQでこれを行うことはできますか?申し訳ありませんが、私はLINQにあまり詳しくありません。それを使用できるという提案を聞いたばかりです。

68
Mariko

List<T>.Sort を呼び出すだけで、リストを並べ替えることができます-in-place

list.Sort();

それは要素の自然な順序付けを使用しますが、これはあなたの場合には問題ありません。

編集:あなたのコードでは、あなたが必要になることに注意してください

_details.Sort();

SortメソッドはList<T>ではなくIList<T>でのみ定義されているためです。 List<T>としてアクセスできない外部からソートする必要がある場合(List<T>部分は実装の詳細であるためキャストしないでください)、もう少し作業が必要です。

私は.NETのIList<T>ベースのインプレースソートを知りません、今では少し奇妙に思います。 IList<T>は必要なものすべてを提供するため、拡張メソッドとしてcouldを記述できます。それらのいずれかを使用したい場合は、クイックソートの実装がたくさんあります。

少しの非効率性を気にしない場合は、常に使用できます。

public void Sort<T>(IList<T> list)
{
    List<T> tmp = new List<T>(list);
    tmp.Sort();
    for (int i = 0; i < tmp.Count; i++)
    {
        list[i] = tmp[i];
    }
}

言い換えれば、コピーして、その場でソートし、ソートされたリストをコピーして戻します。


LINQを使用して、元の値を含むがソートされたnewリストを作成できます。

var sortedList = list.OrderBy(x => x).ToList();

どの動作が必要かによって異なります。シャッフル方法は実際には理想的ではないことに注意してください。

  • メソッド内で新しいRandomを作成すると、いくつかの問題が発生します ここに表示
  • ループ内でvalを宣言できます-デフォルト値を使用していないではありません
  • IList<T>を使用しているknowときにCountプロパティを使用するのがより慣用的です
  • 私の考えでは、forループは、whileループでリストを逆方向にたどるよりも簡単に理解できます

Stack-OverflowでFisher-Yatesを使用したシャッフルの実装は他にもあります-検索するとすぐに見つかります。

134
Jon Skeet

2つの方法があります。

LINQなし:yourList.Sort();

LINQの場合:yourList.OrderBy(x => x).ToList()

詳細は次のとおりです。 http://www.dotnetperls.com/sort-string-array

21
Damiox

別の方法

_details.Sort((s1, s2) => s1.CompareTo(s2)); 
18
lahsrah

LINQでOrderByを使用できるはずです...

var sortedItems = myList.OrderBy(s => s);
11

List<T>.Sort()の何が問題になっていますか?

http://msdn.Microsoft.com/en-us/library/3da4abas.aspx

1
Oleg Dudnyk