使用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时,它比迭代数组要快得多。