按日期排序字符串列表

时间:2018-01-29 02:10:41

标签: c# string list sorting date

我希望按日期对字符串列表进行排序。我收到的字符串显示如下:

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

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

soup

我也尝试过以下多种形式的代码:

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);

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

谢谢!

3 个答案:

答案 0 :(得分:0)

这是对正则表达式进行简单更改以提取初始数字或2位数字:

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

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

答案 1 :(得分:0)

这里有两点

首先,您可以使用{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

答案 2 :(得分:0)

另一个想法是使用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();
}

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

enter image description here