C# 使用lambda表达式对日期排序

C# 使用lambda表达式对日期排序,c#,linq,lambda,C#,Linq,Lambda,我想知道如何使用Lambda表达式对以日期为字段的列表进行排序。该列表应根据特定日期(如生日)之前最接近的日期进行排序 如果我们有以下几天: 2015年11月10日 10/13/2015 10/14/2015 10/15/2015 10/15/2015 2015年10月22日 出生日期是2015年10月14日 日期将按以下顺序排序: 2015年10月14日 10/15/2015 10/15/2015 10/13/2015 10/11/2015 2015年10月22日 第一个结果将是给定的日期在本

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

如果我们有以下几天:

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

出生日期是2015年10月14日

日期将按以下顺序排序:

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

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

您在这里订购的是枢轴、生日和每个日期之间的距离。大概是这样的:

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;
    }
}
试试这个

列表输入=新列表{10/11/2015、10/13/2015、10/14/2015、10/15/2015、10/15/2015、10/22/2015}; List dateArray=input.Selectx=>DateTime.Parsex.ToList; DateTime生日=DateTime.Parse10/14/2015;
dateArray.Sortx,y=>Math.Absx-birth.Ticks.CompareToMath.Absy-birth.Ticks;读起来像是一个家庭作业,这样很容易。嗯。。。写Math.Absbirthdate-date.TotalDays不是很长的一段路吗?查看之前的编辑,看看为什么这还不够
var sorted = data.OrderBy(date => (birthdate - date).TotalDays, new AbsoluteComparer());