C#排序日期时间问题
我设立日期时间列表: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
您省略了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,这就是为什么它是最后一次。
亚当你是对的,而不是看我错误的输出,似乎你实际上运行我的代码,并发现我直接看代码5小时的错误...谢谢! – Shannon 2012-03-01 23:03:28
你正在创建DateTime
对象,将它们转换为strings
,然后分析这些字符串回DateTime
对象,摆脱任何格式设置应用(DateTime
不会在其数据存储为string
表示)。换句话说,最初的.ToString()
调用不起作用。
您需要做的是将DateTime
对象添加到您的列表中,且不会出现绒毛(没有string
转换,也没有解析,只有Convert.ToDateTime()
调用)。只有在对列表进行排序后,如果您在DateTime
对象上调用.ToString()
。
或者,您可以将strings
而不是DateTimes
添加到列表中,然后对其进行排序。在这种情况下,Sort
操作将遵循string
(按字母排序)排序规则,而不是DateTime
排序规则。
转换为字符串并转换回可能会导致该结果。为什么不直接将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秒
按任意键继续。 。 。
你不想来回转换。只做一次。首先对列表进行排序,然后才转换为字符串。如果所有的日期都相同,以防日期也不同,你应该做到以下几点
以上才会工作...
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;
}
我不能重现此。运行上面发布的代码会正确地对日期进行排序。乍一看,它似乎是按字母顺序排序的。你如何输出清单? – 2012-03-01 22:21:45
@Shannon:你确定最后的结果实际上是3/1吗?当我测试你的代码时,我犯了一个错误,导致结果出现在你的订单中,除了最后一行是3/2/2012。见下文。 – 2012-03-01 22:37:36