降順で並べ替えるにはどうすればよいですか、List<Tuple<int, int>>
タプルの最初の要素を順序を決定する値として使用しますか?それはインプレースである必要があり、私は新しいリストを返すLINQを使用してそれを行う方法を知っています。
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
の戻り値を単に否定する必要があります-CompareTo
がint.MinValue
を返すと失敗します。
なぜこれではないのですか?
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
そして、それはその場にありますね。
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;
これでラムダを使用してそれを行うことができます:
list = list.OrderByDescending(x => x.Item1).ToList();
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();