我有一个具有此签名的简单数据类:
internal interface IMyClass {
string Letter { get; }
int Number { get; }
}
我希望能够根据字段(指定为string sortField
)和方向(指定为bool isAscending
)对这些数据进行排序
目前我正在使用switch
(在每个案例中的升序逻辑为if
)
IEnumerable<IMyClass> lst = new IMyClass[];//provided as paramater
switch (sortField)
{
case "letter":
if( isAscending ) {
lst = lst.OrderBy( s => s.Letter );
} else {
lst = lst.OrderByDescending( s => s.Letter );
}
break;
case "number":
if( isAscending ) {
lst = lst.OrderBy( s => s.Number );
} else {
lst = lst.OrderByDescending( s => s.Number );
}
break;
}
这对于 2 个属性来说非常难看,但是当排序逻辑不同时,它就会成为一个问题(我们还看到s => s.Number
在代码中重复了两次)
问题 传递布尔值以选择排序方向的最佳方法是什么?
我尝试过 的我已经拆开 System.Core.dll 并找到了 OrderBy Extension 方法实现:
订购方式:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
){
return new OrderedEnumerable<TSource, TKey>(
source,
keySelector,
null,
false
);
}
按降序排列:
public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
){
return new OrderedEnumerable<TSource, TKey>(
source,
keySelector,
null,
true
);
}
看起来拥有 2 个命名方法的目的是抽象出这个布尔值。我无法像 System.Core 内部那样轻松创建自己的扩展OrderedEnumberable
,并且编写一个从 bool -> methodName -> bool 开始的层对我来说似乎是错误的。