2011-01-12 6 views
17

どのように私は順序を決定する値としてタプルの最初の要素を使用してList<Tuple<int, int>>、降順でソートするに行きますか?それはインプレースでなければならず、私は新しいリストを返すLINQを使ってそれを行う方法しか知りません。ソート一覧<タプル<int, int>>インプレース

答えて

37

:あなたはComparison<T>デリゲートを受け取るオーバーロードやIComparer<T>を使用することができます。後者はおそらく、インラインを指定する方が簡単です:あなたが最初の値と2番目の値で注文したい場合は

list.Sort((x, y) => y.Item1.CompareTo(x.Item1)); 

、それは少しトリッキーが、それでも可能となります。例:

list.Sort((x, y) => { 
    int result = y.Item1.CompareTo(x.Item1)); 
    return result == 0 ? y.Item2.CompareTo(x.Item2) : result; 
}); 

編集:これで、降順で並べ替えるようになりました。これを行う正しい方法は、比較の順序を逆にすることです(yをxからyの代わりにxに)。あなたはないだけCompareToの戻り値を否定しなければならない - CompareToint.MinValueを返すとき、これは失敗します。それはインプレースの並べ替えではないかもしれないので、

+2

は昇順でソートされていませんか? – BobTurbo

+0

@BobTurbo:まあまあです。修正されます。 –

+0

参照元タプルには、Item1とItem2で比較されるデフォルトの比較があります。 http://referencesource.microsoft.com/#mscorlib/system/tuplecs、189 – ShitalShah

6

これはなぜですか?

List<Tuple<int, int>> list = ... 
list = list.OrderBy(i => i.Item1).ToList(); 

はい、それは新しいリストを作成しますが、私は興味があります - これはどうですか?


List<Tuple<int, int>> list = new List<Tuple<int, int>> 
{ 
    new Tuple<int,int>(1,1), 
    new Tuple<int,int>(0,2), 
    new Tuple<int,int>(3,0) 
}; 

list.Sort(Comparer<Tuple<int, int>>.Default); 

生成:

0,2 
1,1 
3,0 

をそして、それはその場でだ、そうではありませんか?

+0

? –

+0

@Martinho:はい、そうではありません。私は私の質問をより明確にするために投稿を編集しました。 – abatishchev

+0

'Tuple ' **は 'Item1'、次に' Item2'でソートすることを文書化していますか? –

3

は、あなたがList<T>.Sort方法を見たことがありますか?あなただけList<T>.Sort方法にIComparer<Tuple<int, int>>またはComparison<Tuple<int, int>>を提供する必要が

list.Sort((x,y)=> x.Item1.CompareTo(y.Item1)); 
2
var listSort = from element in list orderby element.Item1 element.Item2 select element; 
関連する問題