【问题标题】:Sort date using lambda expression [closed]使用 lambda 表达式对日期进行排序 [关闭]
【发布时间】:2015-08-27 22:43:54
【问题描述】:

我想知道如何使用 Lambda 表达式对具有日期作为字段的列表进行排序。该列表应根据最近的日期(之后)特定日期(例如生日)进行排序。

如果我们有以下几天:

2015 年 10 月 11 日
2015 年 10 月 13 日
2015 年 10 月 14 日
2015 年 10 月 15 日
2015 年 10 月 15 日
2015 年 10 月 22 日

出生日期是 2015 年 10 月 14 日

日期将被排序为

2015 年 10 月 14 日
2015 年 10 月 15 日
2015 年 10 月 15 日
2015 年 10 月 13 日
2015 年 10 月 11 日
2015 年 10 月 22 日

  • 第一个结果将是给定的日期(在本例中为出生日期)
  • 然后是比它大的最近日期
  • 或小于它的最近日期
  • 比给定日期多 10 天的日期将在比给定日期少 9 天的日期之后

谢谢!

【问题讨论】:

  • 读起来像家庭作业

标签: c# linq lambda


【解决方案1】:

试试这个

           List<string> input = new List<string>() {"10/11/2015", "10/13/2015", "10/14/2015", "10/15/2015", "10/15/2015", "10/22/2015"};
            List<DateTime> dateArray = input.Select(x => DateTime.Parse(x)).ToList();

            DateTime birthday = DateTime.Parse("10/14/2015");

            dateArray.Sort((x, y) => Math.Abs((x - birthday).Ticks).CompareTo(Math.Abs((y - birthday).Ticks)));

【讨论】:

    【解决方案2】:

    您在这里订购的是枢轴(生日)和每个日期之间的距离。像这样的:

    var sorted = data.OrderBy(date => (birthdate - date).TotalDays);
    

    将按距离排序,但将所有 after 日期放在首位,因为 TotalDays 将为负数,然后是 before 日期。为了避免这种情况,我们需要实现一个自定义的 IComparer 来比较绝对值,并在相等的情况下回退到真实值:

    public class AbsoluteComparer : IComparer<double>
    {
        public int Compare(double x, double y)
        {
            var absX = Math.Abs(x);
            var absY = Math.Abs(y);
    
            if (absX > absY)  
                return 1;
            if (absX < absY)
                return -1;
    
            // If Absolutes are equal, determine by sign.
            if (x > y)
                return 1;
            if (y > x)
                return -1;
    
            return 0;
        }
    }
    

    所以最后的调用是:

    var sorted = data.OrderBy(date => (birthdate - date).TotalDays, new AbsoluteComparer());
    

    【讨论】:

    • ThenBy() 让一切变得简单。
    • 呃……写Math.Abs((birthdate - date).TotalDays) 的方式很长,不是吗?
    • 查看之前的编辑,看看为什么这还不够
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2011-01-13
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多