gpt4 book ai didi

c# - 为什么有 OrderBy 和 OrderByDescending 而没有 OrderBy(SortOrder)?

转载 作者:太空狗 更新时间:2023-10-30 00:00:35 26 4
gpt4 key购买 nike

目前,如果我们将订购方向作为外部依赖项,我们必须使用 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);
}

为什么没有以订单方向为参数的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);
}

更新:

我可以自己写这个,只是希望它已经在框架中:

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");
}

最佳答案

由于 SortOrder 枚举在技术上可以采用 2 个以上的值(想想 (SortOrder) 35),因此它无法准确捕捉二元性。有 2 种方法可确保没有歧义或需要范围检查(顺便说一下,您的示例中缺少这一点)。

也就是说,这是您想要的方法:

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);
}

关于c# - 为什么有 OrderBy 和 OrderByDescending 而没有 OrderBy(SortOrder)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3250718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com