可以通过参数改变顺序吗?

我有一个给出参数“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;

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


您可以轻松地在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);
}

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

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

就如何实现这一点而言,这改变了方法 - 从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到对象)是使用-1/1的乘法器。 这只对数字数据非常有用,但却是达到相同结果的厚颜无耻的方式。


如何通过期望的属性订购desc,

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

然后做类似的事情

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

它是Reverse()太慢吗?

链接地址: http://www.djcxy.com/p/34263.html

上一篇: can one change the order via parameter?

下一篇: LINQ OrderBy anonymous object with projection comparer