Найти минимальную и максимальную дату в массиве с помощью 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.