如何在 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 Date
和 string RawData
字段,我们可以将数据提取到其中。对于接受 string[]
类型 TableData
的列表,我们有一个扩展方法 Append
。该方法遍历字符串数组中的每个字符串,使用与之前相同的方法提取日期,创建一个包含数据和原始数据的 TableData
对象,并将其添加到我们的列表中。
您可以根据需要使用任意多个 string[]
。添加完所有数组后,我们就可以进入 for
循环了。我们列表的排序在这里完成;我个人认为这更具可读性。随意更改事物的名称并根据需要将其适合您的应用程序。
我不确定以前是否有人问过这个问题,但我需要排序的字符串数组很少。这个想法是合并不同的字符串数组,并按作为每个元素一部分的日期字段对它们进行排序。我正在从 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 Date
和 string RawData
字段,我们可以将数据提取到其中。对于接受 string[]
类型 TableData
的列表,我们有一个扩展方法 Append
。该方法遍历字符串数组中的每个字符串,使用与之前相同的方法提取日期,创建一个包含数据和原始数据的 TableData
对象,并将其添加到我们的列表中。
您可以根据需要使用任意多个 string[]
。添加完所有数组后,我们就可以进入 for
循环了。我们列表的排序在这里完成;我个人认为这更具可读性。随意更改事物的名称并根据需要将其适合您的应用程序。