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

时间:2010-01-25 13:39:59

标签: c# .net linq arrays search

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

class Record
{
    public DateTime Date { get; private set; }
}

void Summarize(Record[] arr)
{
    foreach (var r in arr)
    {
        // do stuff 
    }
}

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

如何使用LINQ做到这一点?

5 个答案:

答案 0 :(得分:39)

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

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

Enumerable.MinEnumerable.Max


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

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时,它会比遍历数组快得多。