Based on @Jon Comtois answer you can use the following extension method if you need the specific row number gets filtered out;
/// <summary>
/// Groups and orders by the data partitioning and returns the list of data with provided rownumber
/// It is the equivalent of SQL's ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...)
/// </summary>
/// <typeparam name="TSource">Source type</typeparam>
/// <typeparam name="TGroupingKey">Generic type for grouping property</typeparam>
/// <typeparam name="TOrderKey">Generic type for ordering property</typeparam>
/// <param name="source">Source list to be partitioned</param>
/// <param name="groupingProperty">Grouping property</param>
/// <param name="orderProperty">Ordering property</param>
/// <param name="orderByAsc">Order direction</param>
/// <param name="rowNumber">Rows to be filtered out finally</param>
/// <returns>Partitioned list</returns>
public static List<TSource> FilterByPartitioning<TSource, TGroupingKey, TOrderKey>(this List<TSource> source, Func<TSource, TGroupingKey> groupingProperty, Func<TSource, TOrderKey> orderProperty, bool orderByAsc = true, int rowNumber = 1)
{
var orderedData = orderByAsc ? source.OrderBy(orderProperty) : source.OrderByDescending(orderProperty);
return orderedData.GroupBy(groupingProperty)
.Select(g => new { g, count = g.Count() })
.SelectMany(t => t.g.Select(b => b)
.Zip(Enumerable.Range(1, t.count), (source, i) => new { source, row = i }))
.Where(x => x.row == rowNumber)
.Select(x => x.source).ToList();
}
//Usage
var result = myList.FilterByPartitioning(group => group.PropertyToGroup, order => order.PropertyToOrder, orderByAsc: false, rowNumber: 1);