如何创建排序策略的枚举

Gel*_*elu 2 c# sorting enums

我正在尝试编写一个可以同时接收集合和排序策略的排序方法.

我可以简单地收到一个IComparer,但我更愿意列举一些可能的排序策略.来电者必须从那里挑选他们的.

就像是:

public enum SortingStrategies { ByAgeDesc, ByAgeAsc, ByIncomeDesc, ByInconmeAsc };
Run Code Online (Sandbox Code Playgroud)

其中每一个(ByAgeDesc,ByAgeAsc ......)都是IComparer.

然后调用排序方法将是:

myObject.SortCollection(myCollection, SortingStrategies.ByIncomeDesc);
Run Code Online (Sandbox Code Playgroud)

是否可以创建实例枚举?这是个好主意吗?

提前致谢!

Jon*_*eet 7

我不会为此直接使用enum.我创建了一堆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 = ...;
}
Run Code Online (Sandbox Code Playgroud)

......或者很可能使用组合来做升序/降序部分(例如通过扩展方法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 { ... }
}
Run Code Online (Sandbox Code Playgroud)

这里私有构造函数阻止任何其他子类,但私有嵌套类仍然可以继承它,因为它们有权访问构造函数.

然后,您可以使用您的方法SortingStrategy而不仅仅是IComparer<T>.

当然,正如James建议的那样,从长远来看,使用LINQ可能会更灵活.这取决于你的目标是什么.