如何基于多个列对DataTable进行排序?

3

我有一个 DataTable

Name  Date
bbb   01/01/2011
bbb   01/01/2012
aaa   01/01/2010
aaa   01/01/2011
bbb   01/01/2013
aaa   01/01/2012
bbb   01/01/2010
ccc   01/01/2010
aaa   01/01/2013
ccc   01/01/2012
ccc   01/01/2011

我需要按照名称和每个名称的日期对此表进行排序:
Name  Date
aaa   01/01/2010
aaa   01/01/2011
aaa   01/01/2012
aaa   01/01/2013
bbb   01/01/2010
bbb   01/01/2011
bbb   01/01/2012
bbb   01/01/2013
ccc   01/01/2010
ccc   01/01/2011
ccc   01/01/2012

如何在c#中对DataTable进行排序?

我尝试了以下方法:

   DataView dv = dt.DefaultView;
   dv.Sort = "col1 desc";
   DataTable sortedDT = dv.ToTable();

但这只能按照1列进行排序...

可以看一下这个:http://stackoverflow.com/q/2777765/945456 - Jeff B
3个回答

4
您可以使用LINQ到DataSet。
var sortedDT = dt.AsEnumerable()
                 .OrderBy(r => r.Field<string>("Name"))
                 .ThenBy(r => r.Field<DateTime>("Date"))
                 .CopyToDataTable();

使用CopyToDataTable方法从排序的行中创建新的DataTable。

1
谢谢,但逗号会更容易 =) - Bryuk
1
@Bryuk同意,在这种特定情况下,当你拥有DataView时,基于字符串的排序看起来更简单。如果以后需要更复杂的排序,请查看"使用DataView进行排序"文章。 (http://msdn.microsoft.com/en-us/library/bb669083(v=vs.110).aspx) - Sergey Berezovskiy

2

1
哎呀!抱歉...我需要删除这个问题吗?还是接受并忘记它?=) - Bryuk
@Bryuk:DateDateTime 还是 String 列? - Tim Schmelter
如果是字符串,它将不起作用。添加这些行并查看“令人惊讶”的排序方式:dt.Rows.Add("测试","01/01/2011"); dt.Rows.Add("测试","02/01/2010"); - Tim Schmelter
我必须同意@TimSchmelter的观点。如果它是一个字符串列,你最好使用linq-to-dataset路线,在排序之前可以将其解析为日期。话虽如此,如果你目前处理的数据恰好适用于简单的字符串排序(即你只有1月1日,并且实际上是按年份排序),那么请采取简单的解决方案。但请务必进行注释和单元测试。 - neilh

2
您可以使用 Linq-To-DataSet
var orderedRows = from row in dt.AsEnumerable()
                  orderby row.Field<string>("Name"), row.Field<DateTime>("Date")
                  select row; 
DataTable tblOrdered = orderedRows.CopyToDataTable();

如果“日期”列实际上是一个字符串列,则需要先将其解析为“DateTime”。假设格式有效:
var orderedRows = from row in dt.AsEnumerable()
                  let date = DateTime.Parse(row.Field<string>("Date"), CultureInfo.InvariantCulture)
                  orderby row.Field<string>("Name"), date 
                  select row;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接