下面是我的代码,我试图按降序获得不同的子键
一切都很顺利,但在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();
我写错了吗?
答案 0 :(得分:3)
传递给OrderByDescending
的参数是IEnumerable<string>
,因此e
是您的string
。这意味着您只需按e
排序:
.OrderByDescending(e => e)
答案 1 :(得分:0)
根据one comment:
OP正在期待与上面两行相同的智能感知行为,他从数据表中选择一个字段 - 但此时不再有数据表,只是字符串
也就是说,您希望能够按数据行中的某个字段排序,而不是为Distinct()
操作选择的字段。我认为这有点复杂,但它是可行的。
不幸的是,Distinct()
方法返回一个无序序列。即您不能先订购,然后使用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
答案 2 :(得分:0)
首先,我怀疑它是否有效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);
}
工作正常。