我不确定之前是否曾经问过这个问题,但是我需要对字符串数组进行排序。我们的想法是合并不同的字符串数组,并按日期字段对它们进行排序,日期字段是每个元素的一部分。我正在从sql server表中读回信息。
我怎么能做这样的事情?
数据的示例可能是这样的:
" TYPE |字段1 |字段2 |日期"
" TYPE |字段1 |字段2 |日期"
" TYPE |字段1 |字段2 |日期"
对于第二个阵列:
" TYPE |字段1 |字段2 |字段3 |日期"
" TYPE |字段1 |字段2 |字段3 |日期"
" TYPE |字段1 |字段2 |字段3 |日期"
等
同样适用于其他字符串数组。
基本上,如何根据日期对多个字符串数组进行排序和合并?
如果这有助于解决问题,我可以很容易地进入列表。
哦,另一个问题是不同的数组里面没有相同数量的数据。
答案 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);
}
上面的代码困扰着我,所以我想我会把它重构为更易读,更容易维护的东西。
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
字段,我们可以将数据提取到。对于接受Append
的{{1}}类型的列表,我们有一个扩展方法TableData
。该方法迭代字符串数组中的每个字符串,使用之前相同的方法提取日期,创建一个带有数据&amp;的string[]
对象。原始数据,并将其添加到我们的列表中。
您可以根据需要使用尽可能多的TableData
来执行此操作。一旦你添加了所有数组,我们就可以进入我们的string[]
循环了。列表的排序在这里完成;而且我个人认为这更具可读性。随意更改事物的名称,并根据需要将其放入您的应用程序中。