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

时间:2015-11-17 11:02:40

标签: c# arrays list sorting asmx

我不确定之前是否曾经问过这个问题,但是我需要对字符串数组进行排序。我们的想法是合并不同的字符串数组,并按日期字段对它们进行排序,日期字段是每个元素的一部分。我正在从sql server表中读回信息。

我怎么能做这样的事情?

数据的示例可能是这样的:

  

" TYPE |字段1 |字段2 |日期"

     

" TYPE |字段1 |字段2 |日期"

     

" TYPE |字段1 |字段2 |日期"

对于第二个阵列:

  

" TYPE |字段1 |字段2 |字段3 |日期"

     

" TYPE |字段1 |字段2 |字段3 |日期"

     

" TYPE |字段1 |字段2 |字段3 |日期"

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

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

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

哦,另一个问题是不同的数组里面没有相同数量的数据。

2 个答案:

答案 0 :(得分:4)

尝试类似:

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

答案 1 :(得分:3)

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

            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字段,我们可以将数据提取到。对于接受Append的{​​{1}}类型的列表,我们有一个扩展方法TableData。该方法迭代字符串数组中的每个字符串,使用之前相同的方法提取日期,创建一个带有数据&amp;的string[]对象。原始数据,并将其添加到我们的列表中。

您可以根据需要使用尽可能多的TableData来执行此操作。一旦你添加了所有数组,我们就可以进入我们的string[]循环了。列表的排序在这里完成;而且我个人认为这更具可读性。随意更改事物的名称,并根据需要将其放入您的应用程序中。