在C#中的DataTable/DataView中遇到日期列排序问题

6

我想在C#中对DataView进行排序。DataView类的Sort方法似乎将日期视为字符串。

输出结果如下:

5/9/2013 4:56:38 PM
5/8/2013 4:23:06 PM
5/8/2013 1:38:21 PM
5/7/2013 9:55:30 PM
5/7/2013 7:54:45 PM
5/7/2013 7:44:10 PM
5/7/2013 7:44:10 PM
5/7/2013 12:26:38 PM
5/7/2013 1:44:06 PM
5/6/2013 4:08:54 PM
5/6/2013 10:32:49 AM
5/4/2013 7:54:23 PM
5/4/2013 12:57:21 PM
5/3/2013 3:49:03 PM
5/3/2013 3:49:03 PM
5/3/2013 2:06:12 PM
5/3/2013 11:19:34 AM
5/3/2013 11:03:32 AM
5/3/2013 1:58:38 PM
5/2/2013 7:27:55 PM
5/2/2013 7:17:50 PM
5/2/2013 7:06:06 PM
5/2/2013 6:42:37 PM
5/2/2013 6:30:58 PM
5/13/2013 12:49:24 PM

这是我的代码。

 DataTable dt;  
 DataView dv = dt.DefaultView;
 dv.Sort = "MessageDate desc";
 DataTable sortedDT = dv.ToTable();
 foreach (DataRow row in sortedDT.Rows)
 {
 code to print.
 }

如您所见,最后的日期应该是5/13/2013,而不是在底部,因为如果按照日期比较,5/13>5/9,但如果按字符串处理,则5/13<5/9。

我的声明中MessageDate列是datetime类型,但编译器仍将其转换为字符串。

 public struct Messages
    {
        public string ProfileId { get; set; }
        public string Network { get; set; }
        public string FromId { get; set; }
        public string FromName { get; set; }
        public string FromProfileUrl { get; set; }
        public DateTime MessageDate { get; set; }
        public string Message { get; set; }
        public string FbComment { get; set; }
        public string FbLike { get; set; }
        public string MessageId { get; set; }
        public string Type { get; set; }

    }

有什么想法为什么会出现这种情况,我怎样才能解决这个问题?
2个回答

2

DataView 存储日期或其他数据类型时,使用的是字符串类型。因此,当你进行排序时,它是按照字符串进行排序的。如果你想按照 DateTime 进行排序,则需要在添加任何数据之前将列转换为 DateTime,如下所示:

dt.Columns["Date"].DataType = Type.GetType("System.DateTime");


1
你需要实现 IComparable 接口,以便按照 DateTime 进行排序: http://forums.asp.net/p/1267353/2393006.aspx 或者,如果可以更改结构体,你可以添加一个排序值:
public string SortValue
{
    get
    {
        return ((int)((MessageDate - new DateTime(1970, 1, 1)).TotalSeconds)).ToString("D12");
    }
}

将MessageDate转换为自纪元以来的秒数值,然后可以按字典顺序排序。


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