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

如何对包含c#中日期的字符串数组进行排序?,c#,arrays,list,sorting,asmx,C#,Arrays,List,Sorting,Asmx,我不确定以前是否有人问过这个问题,但我有几个字符串数组需要排序。其思想是合并不同的字符串数组,并按日期字段对它们进行排序,日期字段是每个元素的一部分。我正在从SQLServer表中读取信息 我怎么能这样做呢 数据的示例如下: “类型|字段1 |字段2 |日期” “类型|字段1 |字段2 |日期” “类型|字段1 |字段2 |日期” 对于第二个阵列: “类型|字段1 |字段2 |字段3 |日期” “类型|字段1 |字段2 |字段3 |日期” “类型|字段1 |字段2 |字段3 |日期” 等 这同样

我不确定以前是否有人问过这个问题,但我有几个字符串数组需要排序。其思想是合并不同的字符串数组,并按日期字段对它们进行排序,日期字段是每个元素的一部分。我正在从SQLServer表中读取信息

我怎么能这样做呢

数据的示例如下:

“类型|字段1 |字段2 |日期”

“类型|字段1 |字段2 |日期”

“类型|字段1 |字段2 |日期”

对于第二个阵列:

“类型|字段1 |字段2 |字段3 |日期”

“类型|字段1 |字段2 |字段3 |日期”

“类型|字段1 |字段2 |字段3 |日期”

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

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

如果这有助于解决问题,我可以很容易地列出清单

哦,另一个问题是,不同的阵列中的数据数量不同。

请尝试以下方法:

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 });
            }
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
var arr1=新字符串[]{
“类型|字段1 |字段2 | 2015-01-03 00:00:00”,
“类型|字段1 |字段2 | 2014-01-07 00:00:00”,
“类型|字段1 |字段2 | 2015-01-04 00:00:00”
};
var arr2=新字符串[]{
“类型|字段1 |字段2 |字段3 | 2015-01-04 00:00:00”,
“类型|字段1 |字段2 |字段3 | 2014-01-02 00:00:00”,
“类型| Field1 | Field2 | Field3 | 2015-01-06 00:00:00”
};
var mergedData=新列表();
mergedData.Append(arr1);
mergedData.Append(arr2);
foreach(mergedData.OrderBy(a=>a.Date)中的变量项)
{
Console.WriteLine(item.RawData);
}
}
}
公共结构表数据
{
公共日期时间日期{get;set;}
公共字符串RawData{get;set;}
}
公共静态类扩展
{
公共静态void Append(此列表,字符串[]项)
{
foreach(项目中的var项目)
{
var date=DateTime.ParseExact(item.Substring(item.LastIndexOf(“|”)+1),“yyyy-MM-dd hh:MM:ss”,null);
添加(新的TableData{Date=Date,RawData=item});
}
}
}
本质上,我们正在创建一个
TableData
(请随意命名)列表,其中包含一个
DateTime Date
string RawData
字段,我们可以将数据提取到该字段。我们有一个扩展方法
Append
,用于接受
字符串[]
的类型
TableData
的列表。该方法迭代字符串数组中的每个字符串,使用以前的相同方法提取日期,使用数据和原始数据创建一个
TableData
对象,并将其添加到列表中


您可以使用任意数量的
string[]
执行此操作。一旦您添加了所有数组,我们就可以进入
for
循环了。我们列表的排序在这里完成;我个人认为这更具可读性。您可以随意更改物品名称,并根据需要将其安装到您的应用程序中。

请展示您已经尝试过的内容,然后带着特定问题返回0。踢开发人员谁认为这是一个好主意,存储数据这样。1.分开绳子。2.解析date元素。3.排序。您想在服务器上对数据进行排序,例如,您想要SQL解决方案,还是在您已经检索到数据后在C#代码中进行排序?您好,数据是从不同的表返回的,我只是将所有数据输出到一个区域。按日期排序,这就是为什么字段数不同的原因。至于按“日期”拆分和解析数据,它只适用于一个集合……然后如何合并不同的排序数组。这与查询不同的表的结果相同。在sql端使用“ORDER BY”我可以在服务器上进行排序,但最终的数组数不同,有没有办法将它们全部合并为1?然后如何合并各种“排序”数组?还是名单?或任何集合。将每个数组列为
,使用
list.addrange()
创建一个列表,然后按日期排序。我想Peter已经理解我的问题了!你能解释一下吗?但我不明白这个结构@AbrarAli,您可以
Concat
数组,然后在日期字段上排序:
var sorted=arr1.Concat(arr2.OrderBy(line=>).ToArray()这解决了一个数组的问题..就像上面的解决方案一样。我需要求解多个不同元素长度的数组,并将结果合并为一个:)@AbrarAli我添加了另一个更新,对此我感到有点高兴。在我看来,它更容易阅读,更容易维护和添加。呵呵,我几乎不理解你所做的更改!我还是个学习者:)不过还是要谢谢你!我确实觉得可读性有所提高!谢谢你,我成功了!:)