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

我可以简单地收到一个IComparer,但我希望对可能的排序策略进行枚举。呼叫者必须从那里挑选他们的电话。

就像是:

public enum SortingStrategies { ByAgeDesc, ByAgeAsc, ByIncomeDesc, ByInconmeAsc };


每一个(ByAgeDesc,ByAgeAsc ...)都将是一个IComparer。

然后调用排序方法将是:

myObject.SortCollection(myCollection, SortingStrategies.ByIncomeDesc);


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

提前致谢!

最佳答案

我不会为此使用直接的枚举。我将创建一堆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可能会更加灵活,如James所建议的那样。这取决于您的目标。

08-06 11:49