目前,如果我们将排序方向作为外部依赖关系,我们必须使用if来应用这个方向:
public static IEnumerable<FileInfo> getlist(string directory, string searchPattern, string order)
{
var files = new DirectoryInfo(directory).EnumerateFiles(searchPattern);
if (order == "A")
return files.OrderBy(f => f.CreationTime);
return files.OrderByDescending(f => f.CreationTime);
}
Run Code Online (Sandbox Code Playgroud)
为什么OrderBy不会将订单方向作为参数?在Reflector我看到它或多或少在内部实现,但由于一些奇怪的原因没有暴露.
我更愿意写这样的东西:
public static IEnumerable<FileInfo> getlist(string directory, string searchPattern, string order)
{
return new DirectoryInfo(directory)
.EnumerateFiles(searchPattern)
.OrderBy(f => f.CreationTime, order == "A" ? SortOrder.Ascending : SortOrder.Descending);
}
Run Code Online (Sandbox Code Playgroud)
更新:
我可以自己写这个,只是希望它已经在框架中:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
ListSortDirection order)
{
switch (order)
{
case ListSortDirection.Ascending: return source.OrderBy(keySelector);
case ListSortDirection.Descending: return source.OrderByDescending(keySelector);
}
throw new ArgumentOutOfRangeException("order");
}
Run Code Online (Sandbox Code Playgroud)
由于SortOrder枚举在技术上可以承担超过2个值(想想(SortOrder) 35),因此它不会完全捕获二元性.有两种方法可以确保没有歧义或需要进行范围检查(从您的示例btw中遗漏).
也就是说,这是你想要的方法:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
SortOrder order)
{
if(order < SortOrder.Ascending || order > SortOrder.Descending)
{
throw new ArgumentOutOfRangeException("order");
}
return order == SortOrder.Ascending
? source.OrderBy(keySelector)
: source.OrderByDescending(keySelector);
}
Run Code Online (Sandbox Code Playgroud)
该OrderBy方法已具有您需要的灵活性,以及更多,因为它可以采用可选IComparer<T>参数:
return new DirectoryInfo(directory)
.EnumerateFiles(searchPattern)
.OrderBy(f => f.CreationTime, order == "A"
? Comparer<DateTime>.Default
: new DescendingComparer<DateTime>);
// ...
public DescendingComparer<T> : Comparer<T>
{
public override int Compare(T x, T y)
{
return Comparer<T>.Default.Compare(y, x);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6396 次 |
| 最近记录: |