これには単純な列挙型は使用しません。IComparer<T>
選択する実装の束を作成します。
public static class SortingStrategy
{
public static readonly IComparer<Person> ByAgeDescending = ...;
public static readonly IComparer<Person> ByAgeAscending = ...;
public static readonly IComparer<Person> ByIncomeDescending = ...;
public static readonly IComparer<Person> ByIncomeAscending = ...;
}
...または、コンポジションを使用して昇順/降順の部分を実行する可能性があります (たとえば、拡張メソッドIComparer<T>
を使用して反転ラッパーを作成します)。
もちろん、これは呼び出し元に事前定義された値のいずれかを使用することを強制しません。独自のクラスを使用して強制できます。
public abstract class SortingStrategy : IComparer<Person>
{
public static readonly SortingStrategy ByAgeDescending = ...;
public static readonly SortingStrategy ByAgeAscending = ...;
public static readonly SortingStrategy ByIncomeDescending = ...;
public static readonly SortingStrategy ByIncomeAscending = ...;
private SortingStrategy() {}
private class ByAgeStrategy : SortingStrategy { ... }
private class ByIncomeStrategy : SortingStrategy { ... }
}
ここで、プライベート コンストラクターは他のサブクラスを防ぎますが、ネストされたプライベート クラスはコンストラクターにアクセスできるため、サブクラス化できます。
その後、メソッドSortingStrategy
に だけではなく を取得させることができますIComparer<T>
。
もちろん、ジェームズが示唆したように、長期的には LINQ を使用する方がより柔軟になる可能性があります。それはあなたの目標が何であるかによって異なります。