При работе с данными часто встречаются ситуации, когда у вас есть повторяющиеся строки на основе определенных критериев, таких как совпадающие значения или идентичные данные. В таких случаях вам может потребоваться выбрать только одну строку из каждого набора дубликатов на основе последнего значения даты и времени. В этой статье блога мы рассмотрим различные методы использования LINQ для эффективного выбора последней даты и времени из повторяющихся строк.
Метод 1: GroupBy и Max
Один простой подход — использовать метод GroupBy для группировки строк на основе общих критериев (например, совпадающих значений), а затем использовать метод Max для выбора строки с последней датой и временем. значение.
var result = data
.GroupBy(row => row.CommonCriteria)
.Select(group => group.OrderByDescending(row => row.Datetime).First());
Метод 2: OrderByDescending и Distinct
Другой метод — сортировать строки в порядке убывания на основе значения даты и времени с помощью метода OrderByDescending, а затем использовать метод Distinct для выбора первого вхождения каждого уникального набора дубликатов.
var result = data
.OrderByDescending(row => row.Datetime)
.GroupBy(row => row.CommonCriteria)
.Select(group => group.First());
Метод 3. Соединение и подзапрос
Этот метод предполагает объединение данных с помощью подзапроса, который выбирает последнее значение даты и времени для каждого уникального набора дубликатов.
var result = from row in data
join latestDatetime in
(from r in data
group r by r.CommonCriteria into g
select new
{
CommonCriteria = g.Key,
LatestDatetime = g.Max(r => r.Datetime)
})
on new { row.CommonCriteria, row.Datetime } equals new { latestDatetime.CommonCriteria, latestDatetime.LatestDatetime }
select row;
Метод 4: собственный метод расширения.
Если вам часто приходится выбирать последнюю дату и время из повторяющихся строк, вы можете создать собственный метод расширения для инкапсуляции логики.
public static class LinqExtensions
{
public static IEnumerable<T> SelectLatest<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector, Func<T, DateTime> datetimeSelector)
{
return source
.GroupBy(keySelector)
.Select(group => group.OrderByDescending(datetimeSelector).First());
}
}
// Usage:
var result = data.SelectLatest(row => row.CommonCriteria, row => row.Datetime);
В этой статье мы рассмотрели несколько методов выбора последней даты и времени из повторяющихся строк с помощью LINQ. В зависимости от ваших конкретных требований и предпочтений вы можете выбрать метод, который наилучшим образом соответствует вашим потребностям. Будь то использование GroupBy и Max, OrderByDescending и Distinct, объединение с помощью подзапроса или создание собственного метода расширения, LINQ предоставляет мощные инструменты для эффективной обработки таких сценариев.