使用lambda表达式对日期进行排序

本文关键字:排序 日期 lambda 表达式 使用 | 更新日期: 2023-09-27 18:10:19

我想知道如何排序一个列表,有一个日期作为一个字段使用Lambda表达式。该列表应该基于最近的日期(之后或之前)一个特定日期(例如生日)进行排序。

如果我们有以下天数:

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/2015

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

谢谢!

使用lambda表达式对日期进行排序

试试这个

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

这里排序的是枢轴(出生日期)与每个日期之间的距离。像这样:

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

将按距离排序,但首先放置日期之后的所有,因为TotalDays将是负的,然后是日期之前的。为了避免这种情况,我们需要实现一个自定义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());