次のクラスがあります。
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にあまり詳しくありません。それを使用できるという提案を聞いたばかりです。
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を使用したシャッフルの実装は他にもあります-検索するとすぐに見つかります。
2つの方法があります。
LINQなし:yourList.Sort();
LINQの場合:yourList.OrderBy(x => x).ToList()
詳細は次のとおりです。 http://www.dotnetperls.com/sort-string-array
別の方法
_details.Sort((s1, s2) => s1.CompareTo(s2));
LINQでOrderBy
を使用できるはずです...
var sortedItems = myList.OrderBy(s => s);
List<T>.Sort()
の何が問題になっていますか?