Эффективные методы выбора последней даты и времени из повторяющихся строк с использованием LINQ

При работе с данными часто встречаются ситуации, когда у вас есть повторяющиеся строки на основе определенных критериев, таких как совпадающие значения или идентичные данные. В таких случаях вам может потребоваться выбрать только одну строку из каждого набора дубликатов на основе последнего значения даты и времени. В этой статье блога мы рассмотрим различные методы использования 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 предоставляет мощные инструменты для эффективной обработки таких сценариев.