【问题标题】:List of Dates ordered in a certain way以某种方式排序的日期列表
【发布时间】:2018-11-22 05:02:31
【问题描述】:

我有一个日期列表(yyyyMM 格式的字符串),如下所示:

201608
201609
201610
201708
201709
201710

我想将它们重新排序如下:

201608
201708
201609
201709
201610
201710

我以为我可以反转字符串(即016102)来订购它们显然一个月 >= 10 它会导致问题导致列表出现如下:

201610
201710
201608
201708
201609
201709

我尝试了以下方法: MyList.OrderBy(n => string.Concat(n.datestring.Reverse())).Select(n => n);

有没有一种简洁的方式来做到这一点(LINQ 会很好)?感谢您的帮助。

【问题讨论】:

  • 你不想反转字符串,你想把它分成两个子字符串,年和月,然后分别排序(月,年)。试试myList.OrderBy(s => s.Substring(4)).ThenBy(s => s.Substring(0, 4))
  • 所以,要明确一点,您希望它们按月排序,然后按年排序?或者,您只是按照您说的顺序想要它们。考虑将日期和时间的东西保留为 DateTimes 或 TimeSpan。它们更容易处理。但是,@BrianRogers 的解决方案可能是要走的路(假设我猜对了你的问题陈述)
  • 是的,这就是布赖恩的票。晚了。我脑子里放了个屁!谢谢你解开我!我试试看。

标签: c# linq sorting


【解决方案1】:

使用 LINQ,您可以按两位数月份排序,然后是年份(和月份,但这无关紧要):

var ans = src.OrderBy(s => s.Substring(4)).ThenBy(s => s);

【讨论】:

  • 不错的一个。谢谢!
【解决方案2】:

我会通过扩展方法亲自作弊并按日期订购:

新课程:

public static class DateOperations
{
    public static List<DateTime> GetDates(this List<string> dateStrings)
    {
        List<DateTime> asDates = new List<DateTime>();
        dateStrings.ForEach(e =>
        asDates.Add(DateTime.ParseExact(e, "yyyyMM", CultureInfo.InvariantCulture, DateTimeStyles.None))
        );

        return asDates;
    }
}

然后:

var ordered = myList.GetDates().OrderBy(ord => ord.Month).ThenBy(then => then.Year);

然后当我再次需要该字符串时,我会使用:

date[_whateverAccessorReally].ToString("yyyyMM");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多