我的数据字符串很少
var stringData = new List<string> {"31/01/17 09:15:09",
"1/02/17 09:15:09",
"3/02/17 09:15:09",
"4/02/17 09:15:09",
"30/01/17 09:15:09",
"8/01/17 09:15:09"};
var orderedData = stringData.OrderBy(a => a);
var orderedData1 = stringData.OrderByDescending(a => a);
有没有什么方法可以用正确的排序顺序获取数据?
答案 0 :(得分:4)
var orderedList = stringData.OrderByDescending(x => DateTime.Parse(x)).ToList();
修改强> ParseExact将允许您指定用于解析的日期字符串的确切格式。
var orderedList = stringData.OrderByDescending(
x => DateTime.ParseExact(x, "d/MM/yy hh:mm:ss", CultureInfo.InvariantCulture)).ToList();
答案 1 :(得分:3)
var sortedList = stringData.OrderByDescending(
x => DateTime.ParseExact(x, "d/MM/yy hh:mm:ss", CultureInfo.InvariantCulture)).ToList();
foreach (var item in sortedList)
{
Console.WriteLine(item);
}
这应该给出预期的输出。
说明:
根据列表中提供的值,清楚日期部分首先出现,然后出现月份和年份。日期也可能是一位数,年份只有两位数,所有值都有两位数的月份。
因此对于日期,格式d/MM/yy
对日期部分有意义。
所有值中的时间部分小于12,而分钟和秒部分是自解释的。此外,时间部分没有关于AM或PM的任何信息。
因此,对于时间,格式hh:mm:ss
是合适的。
组合日期和时间的格式以及介于两者之间的空格将正确解析值,因为列表中的值具有由空格分隔的日期和时间部分。
因此最终格式为d/MM/yy hh:mm:ss
。
我们不需要在这里提供任何特定的格式提供者或cultureinfo,因为可以轻松确定日期时间字符串的格式。
答案 2 :(得分:0)
我们的想法是在每个List元素上使用DateTime.Parse,然后使用DateTime结构的ToString将日期格式化为您需要的日期。
这是如何使用Parse函数的示例:
DateTime t1 = DateTime.Parse(stringData[0]);
这是使用ToString格式化它的方法:
string result=t1.ToString("dd/mm/yy");
现在将所有内容组合在一起将是这样的:
var formattedStrings=stringData.Select(DateTime.Parse).Select(x => x.ToString("dd/mm/yy")).OrderByDescending(x => x);
(概念的例子,不是使用它的方法)
答案 3 :(得分:0)
有两种方法可以使您的方案有效。
第一个您可以使用ParseExact
方法将字符串值解析为DateTime
到新集合,或者(另一个选项)仅用于排序:
List<string> result = stringData
.OrderBy(x => DateTime.ParseExact(x, "d/MM/yy HH:mm:ss", CultureInfo.InvariantCulture))
.ToList();
List<DateTime> dateTimeResult = stringData.
.Select(x => DateTime.ParseExact(x, "d/MM/yy HH:mm:ss", CultureInfo.InvariantCulture))
.OrderBy(x => x)
.ToList();
我强烈建议使用第二个并使用DateTime
个对象而不是string
,因为您可能需要使用有序值作为日期,每次转换它们会更糟糕使用DateTime
方法。
答案 4 :(得分:0)
Not tested, but here is lazy way without parsing:
var ordered = (from s in stringData
let a = s.Split('/', ' ')
where a.Length > 2
orderby a[2], a[1], a[0]
select a[0].PadLeft(2, '0') + '/' + a[1].PadLeft(2, '0')
+ '/' + a[2].Substring(a[2].Length - 2)).ToList();