2013-05-14 2 views
6

Я пытаюсь сортировать DataView в C#. Кажется, что метод Sort DataView Class принимает даты как строки.Проблема Сортировка столбца DATE в DataTable/DataView в C#

В выходе я получаю это -

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 Column - это datetime в моем объявлении, но компилятор преобразует его в String.

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; } 

    } 

Любые идеи, почему это происходит и как я могу обойти это?

ответ

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 до секунды -значение-эпохи, а затем оно может быть лексикографически отсортировано.

1

DataView хранит дату или что-то в качестве типа строки. Таким образом, при сортировке он сортируется по строке. Чтобы отсортировать его как DateTime, вам необходимо преобразовать столбец в DateTime, прежде чем добавлять какие-либо данные следующим образом:

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

Смежные вопросы