使用lambda表达式

时间:2015-08-27 22:43:55

标签: c# linq lambda

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

如果我们有以下几天:

2015年10月11日
2015年10月13日
2015年10月14日
二○一五年十月一十五日
二○一五年十月一十五日
2015年10月22日

并且出生日期是10/14/2015

日期将按

排序

二○一五年十月一十四日
二○一五年十月一十五日
二○一五年十月一十五日
2015年10月13日
2015年10月11日
2015年10月22日

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

谢谢!

1 个答案:

答案 0 :(得分:-2)

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

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