如何使用 LINQ 从 DataTable 获得一个独特的、有序的名称列表?

我有一个 DataTable和一个 Name柱。我想生成一个按字母顺序排列的唯一名称的集合。以下查询忽略 订购子句。

var names =
(from DataRow dr in dataTable.Rows
orderby (string)dr["Name"]
select (string)dr["Name"]).Distinct();

为什么 orderby没有得到执行?

26806 次浏览

问题是 运算符不会授予它 维持... 的原有秩序 values.

因此,您的查询将需要像这样工作

var names = (from DataRow dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy( name => name );

试试以下方法

var names = (from dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy(name => name);

这应该能满足你的需求。

To make it more readable and maintainable, you can also split it up into multiple LINQ statements.

  1. First, select your data into a new list, let's call it x1, do a projection if desired
  2. 接下来,创建一个不同的列表,从 x1x2,使用您需要的任何区别
  3. 最后,创建一个有序列表,从 x2x3,按照您希望的顺序进行排序
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);

试试以下方法:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);

抽象地说: 所有的答案都有一些共同点。

OrderBy 需要成为最后一个操作。

你可以使用这样的东西:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);