使用LINQ查找数组中的最小和最大日期?

我有一个带有属性Date的类数组,即:

 class Record { public DateTime Date { get; private set; } } void Summarize(Record[] arr) { foreach (var r in arr) { // do stuff } } 

我必须在这个数组中找到earliest (最小的)和latest (最大的)日期。

我怎么能用LINQ做到这一点?

如果您想找到最早或最晚的日期:

 DateTime earliest = arr.Min(record => record.Date); DateTime latest = arr.Max(record => record.Date); 

Enumerable.Min , Enumerable.Max


如果要查找最早或最晚日期的记录:

 Record earliest = arr.MinBy(record => record.Date); Record latest = arr.MaxBy(record => record.Date); 

请参阅: 如何使用LINQ选择具有最小或最大属性值的对象

没有LINQ的老派解决方案:

 DateTime minDate = DateTime.MaxValue; DateTime maxDate = DateTime.MinValue; foreach (var r in arr) { if (minDate > r.Date) { minDate = r.Date; } if (maxDate < r.Date) { maxDate = r.Date; } } 

二合一LINQ查询(和一次遍历):

 arr.Aggregate( new { MinDate = DateTime.MaxValue, MaxDate = DateTime.MinValue }, (accDates, record) => new { MinDate = record.Date < accDates.MinDate ? record.Date : accDates.MinDate, MaxDate = accDates.MaxDate < record.Date ? record.Date : accDates.MaxDate }); 

使用lambda表达式:

 void Summarise(Record[] arr) { if (!(arr == null || arr.Length == 0)) { List recordList = new List(arr); recordList.Sort((x,y) => { return x.Date.CompareTo(y.Date); }); // I may have this the wrong way round, but you get the idea. DateTime earliest = recordList[0]; DateTime latest = recordList[recordList.Count]; } } 

实质上:

  • 按日期顺序排序到新列表
  • 选择该列表的第一个和最后一个元素

更新:考虑一下,如果您完全关心性能,我不确定这是否可行,因为对整个列表进行排序将导致比仅扫描最高/最低值更多的比较。

我只做两个属性Min,Max,为它们分配你添加到数组中的第一个项的值,然后每次添加一个新项时,只检查它的DateTime是否小于或大于Min Max。

它既漂亮又快速,每次需要获得Min Max时,它比迭代数组要快得多。