如何对包含c#中日期的字符串数组进行排序?
我不确定以前是否有人问过这个问题,但我有几个字符串数组需要排序。其思想是合并不同的字符串数组,并按日期字段对它们进行排序,日期字段是每个元素的一部分。我正在从SQLServer表中读取信息 我怎么能这样做呢 数据的示例如下: “类型|字段1 |字段2 |日期” “类型|字段1 |字段2 |日期” “类型|字段1 |字段2 |日期” 对于第二个阵列: “类型|字段1 |字段2 |字段3 |日期” “类型|字段1 |字段2 |字段3 |日期” “类型|字段1 |字段2 |字段3 |日期” 等 这同样适用于其他字符串数组 那么本质上,如何根据日期对多个字符串数组进行排序和合并呢 如果这有助于解决问题,我可以很容易地列出清单 哦,另一个问题是,不同的阵列中的数据数量不同。请尝试以下方法:如何对包含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 |日期” 等 这同样
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我添加了另一个更新,对此我感到有点高兴。在我看来,它更容易阅读,更容易维护和添加。呵呵,我几乎不理解你所做的更改!我还是个学习者:)不过还是要谢谢你!我确实觉得可读性有所提高!谢谢你,我成功了!:)