簡體   English   中英

如何在C#中對包含日期的字符串數組進行排序?

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

我不確定這是否曾經被問過,但是我有一些字符串數組需要排序。 想法是合並不同的字符串數組,並按作為每個元素一部分的date字段對它們進行排序。 我正在從sql server表中讀取信息。

我該怎么做這樣的事情?

數據的示例可能是這樣的:

“ 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列表(請string RawData命名),該列表具有一個DateTime Date和可將數據提取到的string RawData字段。 我們有一個擴展方法Append用於接受一個string[] TableData類型的List。 該方法遍歷字符串數組中的每個字符串,使用與以前相同的方法提取日期,使用數據和原始數據創建一個TableData對象,並將其添加到我們的列表中。

您可以根據需要使用任意數量的string[]進行此操作。 一旦添加了所有數組,就可以進入for循環了。 我們的列表的排序在這里完成; 我個人認為這更具可讀性。 隨意更改事物的名稱,並根據需要將其適合您的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM