C# LINQ中的升序/降序-可以通过参数更改顺序吗?
我有一个方法,它被赋予参数“bool sortAscending”。现在我想使用LINQ根据这个参数创建排序列表。然后我得到了这个:C# LINQ中的升序/降序-可以通过参数更改顺序吗?,c#,linq,C#,Linq,我有一个方法,它被赋予参数“bool sortAscending”。现在我想使用LINQ根据这个参数创建排序列表。然后我得到了这个: var ascendingQuery = from data in dataList orderby data.Property ascending select data; var descendingQuery = from data in dataList
var ascendingQuery = from data in dataList
orderby data.Property ascending
select data;
var descendingQuery = from data in dataList
orderby data.Property descending
select data;
正如您所看到的,这两个查询只在“升序”方面有所不同。“下降”。我想合并两个查询,但不知道如何合并。有人知道答案吗?就如何实现这一点而言,这将改变方法-从OrderBy/ThenBy改为OrderByDescending/ThenByDescending。但是,您可以将排序单独应用于主查询
var qry = from .... // or just dataList.AsEnumerable()/AsQueryable()
if(sortAscending) {
qry = qry.OrderBy(x=>x.Property);
} else {
qry = qry.OrderByDescending(x=>x.Property);
}
有用吗?您可以动态创建整个“订单”,但它更复杂
另一个技巧(主要适用于LINQ to对象)是使用-1/1的乘法器。这只对数字数据有用,但却是实现相同结果的一种厚颜无耻的方式。您可以轻松地在IEnumerable或IQueryable上创建自己的扩展方法:
public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource,TKey>
(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey>
(this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
按所需属性对desc进行排序怎么样
blah = blah.OrderByDescending(x => x.Property);
然后做一些类似的事情
if (!descending)
{
blah = blah.Reverse()
}
else
{
// Already sorted desc ;)
}
是不是反向()太慢了?除了@Jon Skeet给出的漂亮解决方案外,我还需要ThenBy和ThenBy Descending,因此我根据他的解决方案添加它:
public static IOrderedEnumerable<TSource> ThenByWithDirection<TSource, TKey>(
this IOrderedEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
bool descending)
{
return descending ?
source.ThenByDescending(keySelector) :
source.ThenBy(keySelector);
}
public static IOrderedEnumerable then by with direction(
这是一个不可数的来源,
Func键选择器,
布尔(下降)
{
返回下降?
源。然后按降序(键选择器):
source.ThenBy(键选择器);
}
那么您希望有一个查询可以根据bool sortAsvending值执行升序或降序操作?对吗?我正要写同样的东西,然后我的VS冻结了:(对于int.MinValue的返回值,使用乘法器也会失败。为什么在linq查询中使用orderBy方法而不是使用orderBy关键字?@Joshit,因为我需要在这两种情况下执行不同的操作,在这里使用linq查询语法比仅使用扩展方法没有任何好处。如果您更喜欢查询语法:go这样做,一切都会好的。@MarcGravel非常感谢您的快速回复!!我想,如果两位性能编程大师这样做,那么有没有更深层的原因值得一问;)谢谢您纠正我的愚蠢Marc:)(这就是午餐前发帖的问题…)这篇帖子是由两位SO名人回复和编辑的。Com难道其中一位OrderByWithDirections不应该返回升序吗?@KOL:我不知道你的意思。如果您为降序
@JonSkeet传入false
,这两个函数都将返回升序,感谢您提供的解决方案,但我已经发布了一个关于其用法的问题。请看:可能不是最优化的,但肯定是非常聪明的approach@DiegoPenha嗯,但如果在具体化数据之前它是linq到实体的,那么应该是相同的,不是吗?我的意思是将相应地生成一个sql查询。你同意吗?@DiegoPenha算了吧,linq to entities不支持.Reverse()函数
public static IOrderedEnumerable<TSource> ThenByWithDirection<TSource, TKey>(
this IOrderedEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
bool descending)
{
return descending ?
source.ThenByDescending(keySelector) :
source.ThenBy(keySelector);
}