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

时间:2013-11-25 22:22:03

标签: c# sorting datatable

我有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列......

3 个答案:

答案 0 :(得分:4)

您可以使用LINQ to DataSet

var sortedDT = dt.AsEnumerable()
                 .OrderBy(r => r.Field<string>("Name"))
                 .ThenBy(r => r.Field<DateTime>("Date"))
                 .CopyToDataTable();

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

答案 1 :(得分:2)

http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

您需要做的就是在dv.Sort行的列之间添加逗号。

澄清

dv.Sort = "Name, Date";

答案 2 :(得分: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();

如果Date列实际上是字符串列,则需要先将其解析为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;