C#列表 - 排序日期问题
问题描述:
我有一个C#列表集合,我试图排序。我想要排序的字符串是日期“2009年10月19日”,“2009年10月20日”等。我列表中的排序方法会对日期进行排序,但问题是每天有一位数字,比如“10/2/2009”。发生这种情况时,订单已关闭。它将进入“2009年10月19日”,“10/20/2009”,“2009年11月10日”,“2009年11月2日”,“2009年11月21日”等。这是命令他们错了,因为它认为两者大于1中的10。我该如何纠正?C#列表 - 排序日期问题
感谢
答
问题是他们是字符串,但你想按日期排序。使用比较函数将它们转换为比较前的日期。事情是这样的:
List<string> strings = new List<string>();
// TODO: fill the list
strings.Sort((x, y) => DateTime.Parse(x).CompareTo(DateTime.Parse(y)));
答
假设您的所有字符串将解析:
MyList.OrderBy(d => DateTime.Parse(d));
否则,您可能需要使用ParseExact()或一些更复杂。
答
如果您关心的是性能,并且如果可能,那么您最好在生成字符串之前对您的日期进行排序。然后您将直接使用日期对象进行排序。
然后,您将节省时间来回操纵字符串。
答
我想看看我的表现如何能超越克里斯的解决方案与我自己的IComparer
。差异可以忽略不计。为了排列一百万个日期的同一份清单,我的解决方案花费了63.2秒,Chris的花费了66.2秒。
/// <summary>
/// Date strings must be in the format [M]M/[D]D/YYYY
/// </summary>
class DateStringComparer : IComparer<string>
{
private static char[] slash = { '/' };
public int Compare(string Date1, string Date2)
{
// get date component strings
string[] strings1 = Date1.Split(slash);
string[] strings2 = Date2.Split(slash);
// get date component numbers
int[] values1 = { Convert.ToInt32(strings1[0]),
Convert.ToInt32(strings1[1]),
Convert.ToInt32(strings1[2]) };
int[] values2 = { Convert.ToInt32(strings2[0]),
Convert.ToInt32(strings2[1]),
Convert.ToInt32(strings2[2]) };
// compare year, month, day
if (values1[2] == values2[2])
if (values1[0] == values2[0])
return values1[1].CompareTo(values2[1]);
else
return values1[0].CompareTo(values2[0]);
else
return values1[2].CompareTo(values2[2]);
}
}
为排列日期为预先存在的日期时间的情况下,这花了252毫秒。
只是要清楚,你正在排序表示日期的*字符串*,正确吗? – XXXXX 2009-10-20 20:23:13