【问题标题】:Sort string list with dates in C#在 C# 中使用日期对字符串列表进行排序
【发布时间】:2013-01-18 00:45:53
【问题描述】:

我有一个带有日期的List<string>
我的清单是:

{"01/01/2013","10/01/2013","20/01/2013"}

我想将列表排序为如下所示:

{"20/01/2013","10/01/2013","01/01/2013"}

我该怎么做?

【问题讨论】:

    标签: c# list sorting date


    【解决方案1】:

    您不应该使用字符串表示数据 - 我们都生活在面向对象的世界中 :)

    最好的方法是将这些字符串转换为实际的 DateTime 对象并通过 linq 以相反的顺序对它们进行排序:

    var dates = Array.ConvertAll(dateStrings, x => DateTime.Parse(x));
    return dates.OrderByDesc(x => x);
    

    另一种方法是实现自定义排序功能,请参阅this link。然后你只需在排序函数中使用它:

    DateAsStringComparer myComparer = new DateAsStringComparer();
    dateStrings.Sort(myComparer);
    

    【讨论】:

    • +1,因为你没有像我那样费心进行字符串比较 :)
    • 其实你不需要 lambda,你可以像这样 -Array.ConvertAll(dateStrings,DateTime.Parse)
    【解决方案2】:

    因为它们是 UK/AUS 格式(日/月/年),您可以使用 OrderByDescending 对它们进行排序:

    List<string> dates = new List<string>() { "01/01/2013", "10/01/2013", "20/10/2013" };
    
    foreach (var date in dates.OrderByDescending(x => x))
        Console.WriteLine(date);
    

    我个人会先将它们转换为 DateTime 对象..

    【讨论】:

      【解决方案3】:

      使用 linq:

      var list = new List<string> {"01/01/2013", "10/01/2013", "20/01/2013"};
      var orderedList = list.OrderByDescending(x => DateTime.Parse(x)).ToList();
      

      更新(根据 cmets 中的问题):

      你可以这样处理无效日期(无效日期在那里被视为default(DateTime)):

      var list = new List<string> { "01/01/2013", "10/01/2013", "N/A" , "20/01/2013"  };
      var orderedList2 = list.OrderByDescending(x =>
                  {
                      DateTime dt;
                      DateTime.TryParse(x, out dt);
                      return dt;
                  });
      

      或者,如果您想将无效的日期时间作为列表中的第一项:

      var orderedList3 = list.OrderByDescending(x =>
                  {
                      DateTime dt;
                      if (!DateTime.TryParse(x, out dt)) return DateTime.MaxValue;
                      return dt;
                  }); 
      

      您还可以过滤掉无效日期:

      var filteredList = list.Where(x =>
                  {
                      DateTime dt;
                      return DateTime.TryParse(x, out dt);
                  }).Select(DateTime.Parse).OrderByDescending(x => x);
      

      甚至更好:

      var filteredList = list.Select(x =>
              {
                  DateTime dt;
                  return new {valid = DateTime.TryParse(x, out dt), date = dt};
              }).Where(x => x.valid).Select(x => x.date).OrderByDescending(x => x);
      

      【讨论】:

      • 如果日期时间字符串无效怎么办?有没有办法用特定的字符串来改变那个无效的日期时间?
      • 如果还有字符串呢?喜欢失踪?你是怎么排序的
      【解决方案4】:

      为什么要使用List&lt;string&gt; 而不是List&lt;DateTime&gt;

      List<DateTime> dates = ...
      
      dates.OrderByDescending(c => c).ToList();
      

      【讨论】:

      • 我相信他有他的理由。例如,我也需要它。
      【解决方案5】:

      试试这个:

      List<string> s = new List<string>() { "01/01/2013", "10/01/2013", "20/01/2013" };
      var d = s.OrderByDescending(i => DateTime.ParseExact(i, "dd/MM/yyyy", null));
      

      【讨论】:

        【解决方案6】:

        要将自定义格式的DateTime字符串转换为统一格式的string,可以采用以下simple和safesn-p。

            string formatStr = "yyyyMMddHHmmss";
            string result = Convert.ToDateTime(inputStr).ToString(formatStr);
        

        在代码内部,formatStr可以是DateTime类可以接受的任何可能的形式,你可以设置为你需要的格式,这里你可以使用与你的目标格式字符串匹配的dd/MM/yyyy作为“20/01/2013”​​。

        所以对于你的情况,代码可以简单如下:

            List<string> list = new List<string> { "01/01/2013", "10/01/2013", "20/01/2013" };
            var listAfterSorting = list.OrderByDescending(t => 
                Convert.ToDateTime(t).ToString("dd/MM/yyyy")
                    .ToList());
        

        虽然在某些情况下,使用ParseExact解析数据时间字符串,它会抛出错误/异常String was not recognized as a valid DateTime,在这种情况下如果你转向使用TryParseExact,结果可能是default(DateTime)=@ 987654332@ 因为解析失败。因此,我不推荐ParseExactTryParseExact

        【讨论】:

          猜你喜欢
          • 2016-04-04
          • 2018-07-07
          • 1970-01-01
          • 1970-01-01
          • 2015-12-09
          • 1970-01-01
          • 2020-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多