如何使用LINQ从DataTable获取不同的,有序的名称列表?

时间:2008-08-01 13:14:34

标签: c# linq .net-3.5

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

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

为什么orderby没有得到强制执行?

7 个答案:

答案 0 :(得分:52)

问题在于Distinct  运营商不承认它会  保持原来的顺序  值。

所以你的查询需要像这样工作

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

答案 1 :(得分:32)

为了使其更具可读性和可维护性,您还可以将其拆分为多个LINQ语句。

  1. 首先,选择您的数据到新列表,我们称之为x1,如果需要,可以进行投影
  2. 接下来,使用您需要的任何区别创建一个从x1x2的不同列表
  3. 最后,创建一个有序列表,从x2x3,按您的意愿排序

答案 2 :(得分:8)

var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);

答案 3 :(得分:5)

尝试以下内容:

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

答案 4 :(得分:1)

尝试以下

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

这应该适用于你需要的东西。

答案 5 :(得分:0)

抽象:所有答案都有一些共同之处。

OrderBy需要成为最后的操作。

答案 6 :(得分:0)

您可以使用类似的东西:

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