当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在LINQ中升序/降序-可以通过参数更改顺序吗?》经验,为你挑选了3个好方法。

我有一个方法,给出参数"bool sortAscending".现在我想使用LINQ根据此参数创建排序列表.我得到了这个:

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

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

如您所见,两个查询仅在"升序"中有所不同."降".我想合并两个查询,但我不知道如何.有人有答案吗?



1> Jon Skeet..:

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

public static IOrderedEnumerable OrderByWithDirection
    (this IEnumerable source,
     Func keySelector,
     bool descending)
{
    return descending ? source.OrderByDescending(keySelector)
                      : source.OrderBy(keySelector);
}

public static IOrderedQueryable OrderByWithDirection
    (this IQueryable source,
     Expression> keySelector,
     bool descending)
{
    return descending ? source.OrderByDescending(keySelector)
                      : source.OrderBy(keySelector);
}

是的,你在这里失去了使用查询表达式的能力 - 但坦率地说,在这种情况下,我认为你实际上并没有从查询表达式中受益.查询表达式非常适合复杂的事情,但是如果你只进行一次操作,那么只需要放一个操作就更简单了:

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


这篇文章由SO.com的两位名人回答和编辑
谢谢你纠正我的愚蠢Marc :)(这是在去吃午饭前发布的问题......)

2> Marc Gravell..:

就如何实现而言,这会改变方法 - 从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-Objects)是使用-1/1的乘数.这仅对数字数据非常有用,但却是实现相同结果的一种厚颜无耻的方式.



3> sports..:

如何通过所需的财产订购desc,

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

然后做类似的事情

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

反向()太慢了吗?

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有