我有一个带有属性Date
的类数组,即:
class Record
{
public DateTime Date { get; private set; }
}
void Summarize(Record[] arr)
{
foreach (var r in arr)
{
// do stuff
}
}
我必须在此数组中找到earliest
(最小)和latest
(最大)日期。
如何使用LINQ做到这一点?
答案 0 :(得分:39)
如果您想找到最早或最晚的日期:
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);
请参阅:How to use LINQ to select object with minimum or maximum property value
答案 1 :(得分:14)
没有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;
}
}
答案 2 :(得分:4)
二合一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 });
答案 3 :(得分:1)
使用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];
}
}
本质:
更新:考虑一下,如果您完全关心性能,我不确定这是否可行,因为对整个列表进行排序将导致更多的比较而不仅仅是扫描最高/最低值。
答案 4 :(得分:1)
我只创建两个属性Min,Max,为它们分配你添加到数组中的第一个项的值,然后每次添加一个新项时只检查它的DateTime是否小于或大于Min Max的值。 。
它漂亮而快速,每次需要获得Min Max时,它会比遍历数组快得多。