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


83

私は次のクラスを持っています:

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にあまり詳しくありません。それを使用できるという提案を聞いたばかりです。

回答:


154

次のコマンドを呼び出すだけ、リストをその場で並べ替えることができますList<T>.Sort

list.Sort();

それはあなたの場合には問題ない要素の自然順序を使用します。

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

_details.Sort();

などSortの方法のみで定義されているList<T>、ではありませんIList<T>。アクセスできない外部から並べ替える必要がある場合List<T>List<T>一部は実装の詳細であるため、キャストしないでください)、もう少し作業を行う必要があります。

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

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

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を使用して、元の値を含むがソートされた新しいリストを作成できます。

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

それはあなたが望む行動に依存します。シャッフル方法は実際には理想的ではないことに注意してください。

  • Randomメソッド内で新しいものを作成すると、ここに示す問題のいくつかが発生します
  • valループ内で宣言できます-そのデフォルト値を使用していません
  • で作業していることがわかっているCount場合は、プロパティを使用する方が慣用的です。IList<T>
  • 私の心に、forループがして、リストの後方を通過するよりも理解が簡単ですwhileループ

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


したがって、上記で作成したリストを並べ替える場合は、次のように言う必要があります:sortedList.Sort?
麻理子

並べ替えを試しましたが、機能しません。-リストは次のようになります:IList <string> nD。nD.Sort()を試しましたが、次のように表示されます。シンボル「Sort」を解決できません。
麻理子

@Mariko:_details.Sort()代わりに使用してください-ではなくとして_details宣言されているList<string>ようにIList<string>Sortでのみ宣言されList<T>、では宣言されませんIList<T>
Jon Skeet 2011

24

2つの方法があります:

LINQなし: yourList.Sort();

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

詳細については、http//www.dotnetperls.com/sort-string-arrayをご覧ください。


@ Dminox-私のリストは次のようになります:IList <string> nD。nD.Sort()を試しましたが、次のように表示されます。シンボル「Sort」を解決できません。
麻理子

1
@MarikoSort()List<T> notの メンバーですIList<T>。前者への切り替えを検討することもできます(異なるIList<T>実装で作業することを期待している場合を除く)
dlev 2011

23

別の方法

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

10
これには、オブジェクトをそのプロパティの1つで並べ替えることができるという利点があります
MGOwen 2012年


1

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

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


@ goril-これを使用したいのですが、エラーが発生します。これは私が他のコメントに追加したものです。お役に立てば幸いです-私のリストは次のようになります:IList <string> nD。nD.Sort()を試しましたが、次のように表示されます。シンボル「Sort」を解決できません。
麻理子

1
@Mariko:Sortメソッドを含まないインターフェースIList <T>を使用します。List <T>変数を直接ソートします。言い換えれば_details、例から並べ替えることはできますが、並べ替えることはできませんDetails
Oleg Dudnyk 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.