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#列表 - 排序日期问题

感谢

+1

只是要清楚,你正在排序表示日期的*字符串*,正确吗? – XXXXX 2009-10-20 20:23:13

问题是他们是字符串,但你想按日期排序。使用比较函数将它们转换为比较前的日期。事情是这样的:

List<string> strings = new List<string>(); 

// TODO: fill the list 

strings.Sort((x, y) => DateTime.Parse(x).CompareTo(DateTime.Parse(y))); 

写一个比较的方法来转换“2009年10月2日”的日期,那么比较

+0

或使用或转换为2009/10/10(YYYY/MM/DD) – Erik 2009-10-20 20:17:15

您需要可以使用特定的日期排序,或者使用类似Natural Sort

假设您的所有字符串将解析:

MyList.OrderBy(d => DateTime.Parse(d)); 

否则,您可能需要使用ParseExact()或一些更复杂。

解析字符串为DateTime对象和使用DateTime.Compare

Chris打我吧!

如果您关心的是性能,并且如果可能,那么您最好在生成字符串之前对您的日期进行排序。然后您将直接使用日期对象进行排序。

然后,您将节省时间来回操纵字符串。

我想看看我的表现如何能超越克里斯的解决方案与我自己的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毫秒。