【问题标题】:Sorting a String List by a date按日期对字符串列表进行排序
【发布时间】:2018-07-07 16:30:28
【问题描述】:

我正在寻找按日期对字符串列表进行排序。我收到的字符串如下所示:

  • 1-05-2017,五月初银行假日,苏格兰
  • 1-08-2016,夏季银行假日,苏格兰
  • 1-12-2014,圣安德鲁日,苏格兰
  • 14-04-2017,耶稣受难日,英格兰和威尔士

有没有办法获取日期,即使子字符串的长度是可变的,如果它是单个数字,则无需将 0 附加到初始数字?我尝试使用 Regex.Match() 和 a 但似乎无法找到处理前几位数字的最佳方法:

Match match = Regex.Match(toBeInsertedList.ToString(), @"\d{1}-\d{2}-\d{4}");
string date = match.Value;
var combineList = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.CurrentCulture);

我还尝试了以下多种形式的代码:

var orderedList = toBeInsertedList.OrderByDescending(x => DateTime.Parse(x)).ToList();

任何指导都会很好,因为我还在学习。

谢谢!

【问题讨论】:

    标签: c# string list sorting date


    【解决方案1】:

    只需对正则表达式进行简单更改即可提取初始数字或 2 位数字:

    \d{1,2}-\d{2}-\d{4}
    

    这只是说在第一个破折号之前抓取 1 到 2 位数字。

    【讨论】:

      【解决方案2】:

      这里有两点

      首先,您可以使用{1,2}指定字符数,即匹配1或2个字符。

      \d{1,2}-\d{2}-\d{4}
      

      其次,格式不对

      var combineList = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.CurrentCulture);
      

      应该如下,其中“d”表示数字的最小个数为1,而“dd”表示最小为2。

      var combineList = DateTime.ParseExact(date, "d-MM-yyyy", CultureInfo.CurrentCulture);
      

      下面是我用来测试的代码

      var str = @"1-05-2017,Early May bank holiday,scotland
      1-08-2016,Summer bankholiday, scotland
      1-12-2014,St Andrew's Day,scotland
      14-04-2017,Good Friday, england-and - wales";
      
      var matches = Regex.Matches(str, @"\d{1,2}-\d{2}-\d{4}");
      foreach (var match in matches)
      {
          string date = match.ToString();
          var combineList = DateTime.ParseExact(date, "d-MM-yyyy", CultureInfo.CurrentCulture);
          Debug.WriteLine(combineList.ToString());
      }
      

      结果

      5/1/2017 12:00:00 AM
      8/1/2016 12:00:00 AM
      12/1/2014 12:00:00 AM
      4/14/2017 12:00:00 AM
      

      【讨论】:

      • 谢谢,我做了这个改变——虽然它抛出了一个“字符串不能被识别为有效的日期时间。日期不应该是一个字符串吗?
      • 更新了答案,请单“d”作为格式的最低要求数字。
      • 同样的问题。我确实注意到日期变量是空的,因为它是匹配变量。
      • 我写了一段代码测试,发现没有问题。不过,我添加了它供您查看。
      • 你必须先用逗号分隔。取第 0 个元素,即日期。
      【解决方案3】:

      另一种想法是使用string.Split(',') 将字符串拆分为逗号字符,并从结果数组中获取第一项作为日期字符串,然后使用DateTime.ParseExact() 将字符串解析为有效日期:

      static void Main()
      {
          var lines = new List<string>
          {
              "1-05-2017,Early May bank holiday, scotland",
              "1-08-2016,Summer bankholiday, scotland",
              "1-12-2014,St Andrew's Day,scotland",
              "14-04-2017,Good Friday, england-and-wales"
          };
      
          var orderedLines = lines.OrderByDescending(x => 
              DateTime.ParseExact(x.Split(',')[0], "d-MM-yyyy", 
                  CultureInfo.InvariantCulture)).ToList();
      
          foreach (var line in orderedLines)
          {
              Console.WriteLine(line);
          }
      
          Console.CursorVisible = false;
          Console.Write("\nPress any key to exit...");
          Console.ReadKey();
      }
      

      请注意,结果是以我的本地文化格式打印出来的:

      【讨论】:

      • 我知道你在这里做什么,但我需要保留字符串的其余部分和日期。如果我将它们拆分为单独的变量,我想我将无法以正确的方式对它们进行排序?
      • 哦,对不起,省略了订购部分。我已经更新了样本。是的,您仍然可以按该字段订购。您没有更改实际字符串,只是从中解析日期以获得有序列表。
      猜你喜欢
      • 2021-12-14
      • 2021-12-18
      • 1970-01-01
      • 2021-06-10
      • 2020-11-11
      • 2016-04-04
      • 2018-04-27
      • 2014-04-15
      • 2023-03-04
      相关资源
      最近更新 更多