在LINQ中升序/降序 – 可以通过参数更改顺序吗?

我有一个方法是给出参数“布尔sortAscending”。 现在我想用LINQ根据这个参数创buildsorting列表。 我那时是这样的:

var ascendingQuery = from data in dataList orderby data.Property ascending select data; var descendingQuery = from data in dataList orderby data.Property descending select data; 

正如你所看到的,这两个查询只有在“升序”和resp。 “降”。 我想合并这两个查询,但我不知道如何。 有没有人有答案?

您可以轻松地在IEnumerable或IQueryable上创build自己的扩展方法:

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

是的,你在这里失去了使用查询expression式的能力 – 但坦率地说,在这种情况下我不认为你实际上从查询expression式中受益。 查询expression式对于复杂的事情是很好的,但是如果你只做一个单独的操作,那么只需要执行一个操作就简单了:

 var query = dataList.OrderByWithDirection(x => x.Property, direction); 

就如何实现这一点而言,这将改变方法 – 从OrderBy / ThenBy到OrderByDescending / ThenByDescending。 但是,您可以将这种sorting分别应用于主要查询…

 var qry = from .... // or just dataList.AsEnumerable()/AsQueryable() if(sortAscending) { qry = qry.OrderBy(x=>x.Property); } else { qry = qry.OrderByDescending(x=>x.Property); } 

任何使用? 您可以dynamic创build整个“订单”,但涉及更多…

另一个技巧(主要适用于LINQ到对象)是使用-1/1的乘法器。 这只对数字数据非常有用,但却是达到相同结果的厚颜无耻的方式。

如何订购desc所需的财产,

  blah = blah.OrderByDescending(x => x.Property); 

然后做类似的事情

  if (!descending) { blah = blah.Reverse() } else { // Already sorted desc ;) } 

它是反向()太慢?

除了@Jon Skeet提供的美丽的解决scheme之外,我还需要ThenBy和ThenByDescending,所以我根据他的解决scheme添加它:

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