Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ中的升序/降序-可以通过参数更改顺序吗?_C#_Linq - Fatal编程技术网

C# 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

我有一个方法,它被赋予参数“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;

正如您所看到的,这两个查询只在“升序”方面有所不同。“下降”。我想合并两个查询,但不知道如何合并。有人知道答案吗?

就如何实现这一点而言,这将改变方法-从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);
    }