web-dev-qa-db-ja.com

リストを並べ替える<タプル<整数、整数>>インプレース

降順で並べ替えるにはどうすればよいですか、List<Tuple<int, int>>タプルの最初の要素を順序を決定する値として使用しますか?それはインプレースである必要があり、私は新しいリストを返すLINQを使用してそれを行う方法を知っています。

29
BobTurbo

IComparer<Tuple<int, int>>メソッドにComparison<Tuple<int, int>>またはList<T>.Sortを提供するだけです。後者はおそらくインラインで指定する方が簡単です:

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

最初の値、次に2番目の値の順に並べる場合は、少しトリッキーになりますが、それでも実行可能です。例えば:

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

編集:降順で並べ替えるように上記を修正しました。これを行う正しい方法は、比較の順序を逆にすることです(yからxではなくxからy)。 notCompareToの戻り値を単に否定する必要があります-CompareToint.MinValueを返すと失敗します。

51
Jon Skeet

なぜこれではないのですか?

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

そして、それはその場にありますね。

12
abatishchev

List<T>.Sort メソッドを確認しましたか? Comparison<T> デリゲートまたは IComparer<T> を受け取るオーバーロードを使用できます。

list.Sort((x,y)=> x.Item1.CompareTo(y.Item1));
var listSort = from element in list orderby element.Item1  element.Item2 select element;
4
subbu penumarti

これでラムダを使用してそれを行うことができます:

list = list.OrderByDescending(x => x.Item1).ToList();
1
Alan Yang

X値でIntPointのリストをソートする必要がありました。前の例を変更することでこれを行うことができました。誰かが将来この例を必要とする場合に備えて、ここに私の例を示します。

//Where edges is an unsorted list of edgepoints returned from the C# A.Forge Library
List<IntPoint> edges

//Sorting on the X value of the Intpoint and returning a new List
List<IntPoint> edgesSorted = (from point in edges orderby point.X select point).ToList();
0
Toby