我正在尝试编写一种可以同时接收集合和排序策略的排序方法。
我可以简单地收到一个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所建议的那样。这取决于您的目标。