リストの流sortingなソート< T>拡張方法を使用して複数の基準で?
-
03-07-2019 - |
質問
複数の条件でリストをソートするには、現在次のようなことをしています:
collection.Sort((f1, f2) =>
{
var comp = f1.FirstCriteria.CompareTo(f2.FirstCriteria);
return comp != 0 ? comp : f1.SecondCriteria.CompareTo(f2. SecondCriteria);
});
しかし、次のようなことができると便利ではありません:
collection.MultipleSort(f1.FirstCriteria, f2.FirstCriteria)
.Then(f1.SecondCriteria, f2.SecondCriteria)
並べ替えのための流interfaceなインターフェイスを適切に実装するためのアイデアはありますか?
解決
次のようなものですか?
using System.Linq;
collection.OrderBy(t => t.FirstCriteria).ThenBy(t => t.SecondCriteria);
他のヒント
ここでの問題は、インプレースソートを行いたいようだということです。その場合、条件の追加がいつ完了したかを(流れるようなAPIを使用して)知る必要があります。これは、遅延実行を使用するため、LINQアプローチとは対照的です。
単一条件のソートでは、次のようなものを使用できます。
public static void Sort<TSource, TValue>(this List<TSource> source,
Func<TSource, TValue> selector) {
var comparer = Comparer<TValue>.Default;
source.Sort((x,y)=>comparer.Compare(selector(x),selector(y)));
}
public static void SortDescending<TSource, TValue>(this List<TSource> source,
Func<TSource, TValue> selector) {
var comparer = Comparer<TValue>.Default;
source.Sort((x,y)=>comparer.Compare(selector(y),selector(x)));
}
複数のソートを使用するのは困難です。各 TValue
は異なる可能性があるため、 params
は使用できません。おそらく、ターミネーターステップと中間の「ビルダー」を使用する必要があります。クラス(本質的にDSLを記述する)、または最初に比較器を個別に構築する必要があります。
所属していません StackOverflow