在" ddmmyy"中对字符串数据进行排序格式

时间:2017-02-08 10:18:10

标签: c# c#-4.0

我的数据字符串很少

  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);

有没有什么方法可以用正确的排序顺序获取数据?

5 个答案:

答案 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();