リストの流sortingなソート< T>拡張方法を使用して複数の基準で?

StackOverflow https://stackoverflow.com/questions/802002

  •  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を記述する)、または最初に比較器を個別に構築する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top