2012-03-01 347 views
-1

我设立日期时间列表:C#排序日期时间问题

DateTime a1 
DateTime a2 
DateTime a3 
DateTime a4 

上面这个样子的(如datetime对象):

3/1/2012 10:56 
3/1/2012 17:03 
3/1/2012 1:38 
3/1/2012 5:33 

然后我把它们放在一个列表排序:

List<DateTime> ldtBites = new List<DateTime>(); 
ldtBites.Add(a1); 
ldtBites.Add(a2); 
ldtBites.Add(a3); 
ldtBites.Add(a4); 
ldtBites.Sort(); 

排序后,我得到这个:

3/1/2012 1:38:00 AM 
3/1/2012 10:56 AM 
3/1/2012 5:03:00 PM 
3/1/2012 5:33:00 AM 
+2

我不能重现此。运行上面发布的代码会正确地对日期进行排序。乍一看,它似乎是按字母顺序排序的。你如何输出清单? – 2012-03-01 22:21:45

+0

@Shannon:你确定最后的结果实际上是3/1吗?当我测试你的代码时,我犯了一个错误,导致结果出现在你的订单中,除了最后一行是3/2/2012。见下文。 – 2012-03-01 22:37:36

回答

2

您省略了w,x,y,z的定义。我将它们定义为:

DateTime w = new DateTime(2012, 3, 1, 10, 56, 0); 
DateTime x = new DateTime(2012, 3, 1, 17, 3, 0); 
DateTime y = new DateTime(2012, 3, 1, 1, 38, 0); 
DateTime z = new DateTime(2012, 2, 29, 17, 3, 0); 

这会使它们与您的a1-a4值相匹配;但是,当我运行代码的其余部分时,它们会正确排序(a3,a4,a1,a2)。

然而,我注意到,X和Z是相同的小时/分钟,所以我最初的测试了这一点:

DateTime z = new DateTime(2012, 3, 1, 17, 3, 0); 

当我跑了这一点,我得到了他们的才能出来你展示(a3,a1,a2,a4);然而,在AddHours()呼叫经过后,z的值实际上是3/2/2012,这就是为什么它是最后一次。

+0

亚当你是对的,而不是看我错误的输出,似乎你实际上运行我的代码,并发现我直接看代码5小时的错误...谢谢! – Shannon 2012-03-01 23:03:28

0

你正在创建DateTime对象,将它们转换为strings,然后分析这些字符串回DateTime对象,摆脱任何格式设置应用(DateTime不会在其数据存储为string表示)。换句话说,最初的.ToString()调用不起作用。

您需要做的是将DateTime对象添加到您的列表中,且不会出现绒毛(没有string转换,也没有解析,只有Convert.ToDateTime()调用)。只有在对列表进行排序后,如果您在DateTime对象上调用.ToString()

或者,您可以将strings而不是DateTimes添加到列表中,然后对其进行排序。在这种情况下,Sort操作将遵循string(按字母排序)排序规则,而不是DateTime排序规则。

0

转换为字符串并转换回可能会导致该结果。为什么不直接将x,y,w,z添加到列表中?

List<DateTime> ldtBites = new List<DateTime>(); 
ldtBites.Add(DateTime.Parse("3/1/2012 10:56")); 
ldtBites.Add(DateTime.Parse("3/1/2012 17:03")); 
ldtBites.Add(DateTime.Parse("3/1/2012 1:38")); 
ldtBites.Add(DateTime.Parse("3/1/2012 5:33")); 
ldtBites.Sort(); 

foreach (DateTime dt in ldtBites) 
    Console.WriteLine(dt); 

输出:

2012/3/1上午01点38分00秒

2012/3/1上午05点三十三分00秒

2012/3/1 10: 56:00 AM

2012/3/1下午5时03分00秒

按任意键继续。 。 。

0

你不想来回转换。只做一次。首先对列表进行排序,然后才转换为字符串。如果所有的日期都相同,以防日期也不同,你应该做到以下几点

0

以上才会工作...

var sortedDates = dates.OrderByDescending(x => x); 

或者不想使用,或者不知道LINQ的,那么你可以去以下..

static List SortAscending(List list) 
{ 
list.Sort((a, b) => a.CompareTo(b)); 
return list; 
} 

static List SortDescending(List list) 
{ 
list.Sort((a, b) => b.CompareTo(a)); 
return list; 
}