如何在 C# 中对包含日期的字符串数组进行排序?

How to sort a string array which includes a date in c#?

我不确定以前是否有人问过这个问题,但我需要排序的字符串数组很少。这个想法是合并不同的字符串数组,并按作为每个元素一部分的日期字段对它们进行排序。我正在从 sql 服务器 table.

读回信息

我怎么能去做这样的事情呢?

数据示例可能是这样的:

"TYPE|Field1|Field2|Date"

"TYPE|Field1|Field2|Date"

"TYPE|Field1|Field2|Date"

对于第二个数组:

"TYPE|Field1|Field2|Field3|Date"

"TYPE|Field1|Field2|Field3|Date"

"TYPE|Field1|Field2|Field3|Date"

等等

同样适用于其他字符串数组。

那么本质上,如何根据日期对多个字符串数组进行排序和合并?

如果这有助于解决问题,我可以很容易地转到列表。

哦,另一个问题是不同的数组中不会有相同数量的数据。

试试这样的东西:

var sorted = input.OrderBy(line => DateTime.Parse(line.Split('|').Last()))
                  .ToArray();

这是您的代码的一个工作示例。无论它有多少字段,它都会对数组进行排序。您可能希望根据阅读的内容更改格式。

            var arr1 = new string[] { 
                "TYPE|Field1|Field2|2015-01-03 00:00:00",
                "TYPE|Field1|Field2|2014-01-07 00:00:00",
                "TYPE|Field1|Field2|2015-01-04 00:00:00"
            };

            var orderedArr1 = arr1.OrderBy(a => DateTime.ParseExact(a.Substring(a.LastIndexOf('|') + 1), "yyyy-MM-dd hh:mm:ss", null ));

            foreach(var a in orderedArr1)
            {
                Console.WriteLine(a);
            }

更新

合并 2 个数组然后进行排序:

            var arr1 = new string[] { 
                "TYPE|Field1|Field2|2015-01-03 00:00:00",
                "TYPE|Field1|Field2|2014-01-07 00:00:00",
                "TYPE|Field1|Field2|2015-01-04 00:00:00"
            };

            var arr2 = new string[] { 
                "TYPE|Field1|Field2|Field3|2015-01-04 00:00:00",
                "TYPE|Field1|Field2|Field3|2014-01-02 00:00:00",
                "TYPE|Field1|Field2|Field3|2015-01-06 00:00:00"
            };

            var mergedArrs = arr1.Concat(arr2);

            var orderedArr1 = mergedArrs.OrderBy(a => DateTime.ParseExact(a.Substring(a.LastIndexOf('|') + 1), "yyyy-MM-dd hh:mm:ss", null));

            foreach(var a in orderedArr1)
            {
                Console.WriteLine(a);
            }

更新 2

更面向对象的方法

上面的代码让我很困扰,所以我想我会把它重构为更易读和更容易维护的东西。

    class Program
    {
        static void Main(string[] args)
        {
            var arr1 = new string[] { 
            "TYPE|Field1|Field2|2015-01-03 00:00:00",
            "TYPE|Field1|Field2|2014-01-07 00:00:00",
            "TYPE|Field1|Field2|2015-01-04 00:00:00"
            };

            var arr2 = new string[] { 
            "TYPE|Field1|Field2|Field3|2015-01-04 00:00:00",
            "TYPE|Field1|Field2|Field3|2014-01-02 00:00:00",
            "TYPE|Field1|Field2|Field3|2015-01-06 00:00:00"
            };

            var mergedData = new List<TableData>();
            mergedData.Append(arr1);
            mergedData.Append(arr2);

            foreach (var item in mergedData.OrderBy(a => a.Date))
            {
                Console.WriteLine(item.RawData);
            }
        }
    }

    public struct TableData
    {
        public DateTime Date { get; set; }
        public string RawData { get; set; }
    }

    public static class Extensions
    {
        public static void Append(this List<TableData> list, string[] items)
        {
            foreach(var item in items)
            {
                var date = DateTime.ParseExact(item.Substring(item.LastIndexOf('|') + 1), "yyyy-MM-dd hh:mm:ss", null);
                list.Add(new TableData { Date = date, RawData = item });
            }
        }
    }

本质上,我们正在创建一个 TableData(随意命名)的列表,其中有一个 DateTime Datestring RawData 字段,我们可以将数据提取到其中。对于接受 string[] 类型 TableData 的列表,我们有一个扩展方法 Append。该方法遍历字符串数组中的每个字符串,使用与之前相同的方法提取日期,创建一个包含数据和原始数据的 TableData 对象,并将其添加到我们的列表中。

您可以根据需要使用任意多个 string[]。添加完所有数组后,我们就可以进入 for 循环了。我们列表的排序在这里完成;我个人认为这更具可读性。随意更改事物的名称并根据需要将其适合您的应用程序。