通过比较字符串的日期时间部分来对字符串列表进行排序

时间:2017-03-21 22:34:57

标签: c# list sorting

我想对字符串列表进行排序。以下预排序字符串示例:

  

“2017-03-21 17:14:36.111我喜欢红色”
  “2017-03-21 17:14:35.333我喜欢黄色”
  “2017-03-21 17:14:36.111我喜欢绿色”

我想仅使用datetime子字符串对列表进行排序。

private void MergeAndSort(string[] lines1, string[] lines2)
{
    var entries = new List<string>();
    entries.AddRange(lines1);
    entries.AddRange(lines2);
    entries.Sort();
    foreach (string entry in entries)
    {
        CombinedrichTextBox.AppendText(entry);
    }
}

2 个答案:

答案 0 :(得分:0)

假设您的日期/时间字符串长度保持不变,您可以这样做。

        string[] entries =
        {
            "2017-03-21 17:14:36.380 I like Red",
            "2017-03-21 17:14:35.380 I like Yellow",
            "2017-03-21 17:14:36.380 I like Green"
        };

        var data = new List<Tuple<DateTime, string>>();

        foreach (var entry in entries)
        {
            data.Add(
                new Tuple<DateTime, string>(DateTime.Parse(entry.Substring(0, 23)), 
                entry.Substring(23)));
        }

        var sorted = data.OrderBy(e => e.Item1);
        entries = sorted.Select(e => $"{e.Item1} {e.Item2}").ToArray();

答案 1 :(得分:0)

关于标准DateTime字符串的一个很酷的事情是,您不需要转换它们以对它们进行排序。你可以对字符串进行排序。

那么你的问题在于弄清楚日期/时间字符串的位置。你可以像Ahsan建议的那样做,并使用字符串中的位置。您可以查找字符串中的第一个字母。这取决于实际的字符串,而不仅仅是示例。

我可以只用一个C#语句吗?你敢打赌!

var sorted = lines1
  .concat(item2)
  .Sort((a,b) => string.Compare(a.Substring(0,23), b.Substring(0,23)))
  .ToList();

这个例子有点草率,因为它假设在每个字符串的前面总会有一个标准日期,这通常是一个危险的假设。如果您还假设DateTime字符串都是唯一的,并且毫秒分辨率表明它们是,那么您不需要执行子字符串,您可以使用Sort()。