【问题标题】:OrderByDescending in lambdaExpression is not accepting parameterslambdaExpression 中的 OrderByDescending 不接受参数
【发布时间】:2017-10-15 03:32:47
【问题描述】:

下面是我的代码,我试图按降序获取不同的子键 一切都很好,但在OrderByDescending 中并不建议字段

 List<string> Sub_key_list = dt
   .AsEnumerable()
   .Select(d => d.Field<string>("Sub_Key_Name"))
   .Distinct()
   .OrderByDescending(e => e.not suggesting field here )
   .ToList();

我写错了吗?

【问题讨论】:

  • 为什么会建议一个字段?你得到一个不同的字符串序列......你希望建议什么“字段”? Length,也许?
  • 我怀疑你只需要e =&gt; e....
  • 您已经从dt 中选择了Sub_Key_Name,并且在orderByDescending 中没有其他字段可供建议。
  • @Abi 好吧,例如,您当然可以按字符串的长度排序。
  • @PeterDuniho OP 期待与上面两行相同的智能感知行为,他从数据表中选择一个字段 - 但此时没有更多数据表,只有字符串;o)

标签: c# linq lambda


【解决方案1】:

传递给OrderByDescending 的参数是IEnumerable&lt;string&gt;,所以e 在这里是你的string。这意味着您可以像这样通过e 订购:

.OrderByDescending(e => e)

【讨论】:

    【解决方案2】:

    根据one comment

    OP 期待与上面两行相同的智能感知行为,他从数据表中选择一个字段 - 但此时没有更多数据表,只有字符串

    也就是说,您希望能够按数据行中的某个字段而不是您为Distinct() 操作选择的字段进行排序。我认为这有点复杂,但它是可行的。

    不幸的是,Distinct() 方法返回一个无序序列。 IE。您不能先订购,然后使用Distinct()。这使我们无法将我们关心的排序字段和最终值提取到匿名类型中,对数据进行排序,然后在结果上使用Distinct()

    另一方面,如果没有自定义相等比较器实现,Distinct() 会将其逻辑应用于整个对象,而不仅仅是一个字段(没有允许您为操作选择值的重载)。所以我们需要提供一个自定义的相等比较器,它仍然可以用于匿名类型,但会变得更加复杂。

    还有一个逻辑问题:Distinct() 操作必然会将具有相同值的几行缩减为一行。这导致只有一个排序字段值,从可能存在的许多值中,但您无法选择哪一个。

    幸运的是,以上所有问题都可以使用GroupBy() 而不是Distinct() 来解决。使用GroupBy(),您最初可以选择包含感兴趣字段的匿名类型,然后按特定键(在本例中为“Sub_Key_Name”值)对它们进行分组,但不会丢失任何排序字段。然后,您可以使用应用程序中有意义的任何逻辑从排序字段中进行选择(您的问题未指定,因此对于本示例,我只使用最大值),并使用该值对结果进行实际排序。最后,只选择分组键可以获得您想要的最终值。

    看起来像这样:

    List<string> Sub_key_list = dt
       .AsEnumerable()
       .Select(d => new
       {
           OrderKey = d.Field<int>("OrderKey"), // i.e. whatever you want here
           Value = d.Field<string>("Value"),
       })
       .GroupBy(e => e.Value)
       .OrderByDescending(e => e.Max(x => x.OrderKey)) // I used Max...use whatever you want
       .Select(e => e.Key)
       .ToList();
    


    如需更多灵感,另请参阅相关/类似问题:
    Linq orderby and distinct
    Select Multiple Fields from List in Linq
    Distinct in Linq based on only one field of the table

    【讨论】:

      【解决方案3】:

      首先我怀疑它是否有效 d.Field("Sub_Key_Name") ?

      我创建了一个简单的字符串列表示例,然后进行排序:

      var list = new List<string>();
              list.Add("a");
              list.Add("ab");
              list.Add("ab");
              list.Add("abc");
              list.Add("lmn");
              list.Add("xyz");
      
              var q = list.AsEnumerable().Select(s => s).Distinct().OrderByDescending(s => s).ToList();
      
              foreach(var i in q)
              {
                  Console.WriteLine(i);
              }
      

      它工作正常。

      【讨论】:

      • “我怀疑它是否有效” -- 你为什么这么说? OP 显示的代码工作正常,假设您从 dt 变量的 DataTable 对象开始(这似乎是相同的假设),并且只要该表中实际上有一个 "Sub_Key_Name" 列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2022-11-25
      • 2016-10-31
      • 2018-03-16
      相关资源
      最近更新 更多