我有一个包含Date
属性的类数组,例如:
class Record
{
public DateTime Date { get; private set; }
}
void Summarize(Record[] arr)
{
foreach (var r in arr)
{
// do stuff
}
}
我需要在这个数组中找到最早的和最晚的日期。
如何使用LINQ实现?
我有一个包含Date
属性的类数组,例如:
class Record
{
public DateTime Date { get; private set; }
}
void Summarize(Record[] arr)
{
foreach (var r in arr)
{
// do stuff
}
}
我需要在这个数组中找到最早的和最晚的日期。
如何使用LINQ实现?
如果您想查找最早或最晚的日期:
DateTime earliest = arr.Min(record => record.Date);
DateTime latest = arr.Max(record => record.Date);
如果您想查找具有最早或最晚日期的记录:
Record earliest = arr.MinBy(record => record.Date);
Record latest = arr.MaxBy(record => record.Date);
没有使用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;
}
}
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<Record> recordList = new List<Record>(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时迭代整个数组要快得多。