使用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天的日期之后出现
谢谢!
试试这个
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());