C# lambdaExpression中的OrderByDescending不接受参数

C# lambdaExpression中的OrderByDescending不接受参数,c#,linq,lambda,C#,Linq,Lambda,下面是我的代码,我试图以降序获得不同的子键 一切正常,但在OrderByDescending中,它不是建议字段 List<string> Sub_key_list = dt .AsEnumerable() .Select(d => d.Field<string>("Sub_Key_Name")) .Distinct() .OrderByDescending(e => e.not suggesting field here ) .

下面是我的代码,我试图以降序获得不同的子键 一切正常,但在
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();
List Sub\u key\u List=dt
.可计算的()
.Select(d=>d.Field(“子关键字名称”))
.Distinct()
.OrderByDescending(e=>e.此处不建议使用字段)
.ToList();

我写错了吗?

传递给
OrderByDescending
的参数是
IEnumerable
,因此
e
是您的
字符串。这意味着您可以通过
e
这样简单地订购:

.OrderByDescending(e => e)
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();

传递给
OrderByDescending
的参数是一个
IEnumerable
,因此
e
是您的
字符串。这意味着您可以通过
e
这样简单地订购:

.OrderByDescending(e => e)
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();
根据:

OP期待着与上面两行相同的intellisense行为,在这两行中他从datatable中选择了一个字段,但此时不再有datatable,只有string

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

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

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

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

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

看起来是这样的:

.OrderByDescending(e => e)
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();
List Sub\u key\u List=dt
.可计算的()
.选择(d=>new
{
OrderKey=d.Field(“OrderKey”),//即此处所需的任何内容
值=d.字段(“值”),
})
.GroupBy(e=>e.Value)
.OrderByDescending(e=>e.Max(x=>x.OrderKey))//我用了Max…你想用什么就用什么
.选择(e=>e.Key)
.ToList();

有关更多灵感,请参见相关/类似问题:



根据:

OP期待着与上面两行相同的intellisense行为,在这两行中他从datatable中选择了一个字段,但此时不再有datatable,只有string

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

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

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

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

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

看起来是这样的:

.OrderByDescending(e => e)
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();
List Sub\u key\u List=dt
.可计算的()
.选择(d=>new
{
OrderKey=d.Field(“OrderKey”),//即此处所需的任何内容
值=d.字段(“值”),
})
.GroupBy(e=>e.Value)
.OrderByDescending(e=>e.Max(x=>x.OrderKey))//我用了Max…你想用什么就用什么
.选择(e=>e.Key)
.ToList();

有关更多灵感,请参见相关/类似问题: