Найти минимальную и максимальную дату в массиве с помощью LINQ?

У меня есть массив классов с свойством Date, то есть:

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

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

Я должен найти даты earliest (минимум) и latest (максимум) в этом массиве.

Как это сделать с помощью LINQ?

Ответы

Ответ 1

Если вы хотите найти самую раннюю или последнюю дату:

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 для выбора объекта с минимальным или максимальным значением свойства

Ответ 2

старое решение для школы без 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;
    }
}

Ответ 3

Два в одном запросе LINQ (и один обход):

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

Ответ 4

Использование лямбда-выражений:

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];
    }
}

По существу:

  • Сортировка в новый список по порядку даты
  • Выберите первый и последний элементы этого списка

ОБНОВЛЕНИЕ: Думая об этом, я не уверен, что это способ сделать это, если вы вообще не заботитесь о производительности, поскольку сортировка всего списка приведет к гораздо большему сравнению, чем просто сканирование для самых высоких/минимальных значений.

Ответ 5

Я бы просто создал два свойства Min, Max, назначив им значение первого элемента, добавляемого в массив, и каждый раз, когда вы добавляете новый элемент, просто проверьте, меньше ли его DateTime, чем Min Max,

Его приятный и быстрый, и он будет намного быстрее, чем повторение через массив каждый раз, когда вам нужно получить Min Max.