Найти минимальную и максимальную дату в массиве с помощью LINQ? - PullRequest
17 голосов
/ 25 января 2010

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

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

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

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

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

Ответы [ 5 ]

39 голосов
/ 25 января 2010

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

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

14 голосов
/ 25 января 2010

решение старой школы без 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;
    }
}
4 голосов
/ 26 января 2010

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 });
1 голос
/ 25 января 2010

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

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

1 голос
/ 25 января 2010

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

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

По существу:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...