c# – 为什么这个LINQ查询没有返回正确的日期?

以下LINQ查询读取分隔文件并返回每个recordId的最新记录.问题是,最近的记录并不总是返回.我究竟做错了什么?我需要更改什么以确保始终返回最近的日期?有没有比使用.Max()更好的方法?

我还附上了一些示例数据,以便您可以看到问题.查看示例数据时,标有星号(*)的行是我想要返回的行(最近的日期).在我看来,标有X的行是错误的,返回了.

如果同一记录ID多次出现(例如#162337)并且有多个日期,我希望返回一个记录最近日期的记录.

var recipients = File.ReadAllLines(path)
    .Select (record => record.Split('|'))
    .Select (tokens => new 
        {
        FirstName = tokens[2],
        LastName = tokens[4],
        recordId = Convert.ToInt32(tokens[13]),
        date = Convert.ToDateTime(tokens[17])
        }
    )
    .GroupBy (m => m.recordId)
    .OrderByDescending (m => m.Max (x => x.date ) )
    .Select (m => m.First () )
    .OrderBy (m => m.recordId )

    .Dump();


FirstName   LastName    recordId    date    
fname   lname   137308  2/15/1991 0:00  
fname   lname   138011  6/16/1983 0:00  *
fname   lname   138011  11/9/1981 0:00  x
fname   lname   158680  9/4/1986 0:00   
fname   lname   161775  4/23/1991 0:00  
fname   lname   162337  12/1/1998 0:00  *
fname   lname   162337  12/1/1998 0:00  *
fname   lname   162337  9/1/1994 0:00   x
fname   lname   162337  9/1/1994 0:00   x
fname   lname   163254  2/12/1969 0:00  
fname   lname   173816  9/26/1997 0:00  
fname   lname   178063  1/16/1980 0:00  *
fname   lname   178063  3/3/1976 0:00   x
fname   lname   180725  7/1/2007 0:00   *
fname   lname   180725  1/14/1992 0:00  x
fname   lname   181153  5/1/2001 0:00
您按照每个组中的最大日期排序整个组序列.您需要做的是在每个组中进行排序,以便仅选择具有最大日期的项目.

var recipients = File.ReadAllLines(path)
                     .Select(record => record.Split('|'))
                     .Select(tokens => new
                         {
                             FirstName = tokens[2],
                             LastName = tokens[4],
                             recordId = Convert.ToInt32(tokens[13]),
                             date = Convert.ToDateTime(tokens[17])
                         })
                     .GroupBy(m => m.recordId,
                              (k, g) => g.OrderByDescending(m => m.date).First())
                     .OrderBy(m => m.recordId);

如果性能很重要且每个组可能包含许多项目,那么如果使用Aggregate确定组中的最大记录而不是OrderByDescending / First组合,则可能会看到略有改进:

// ...
.GroupBy(m => m.recordId,
         (k, g) => g.Aggregate((a, m) => (m.date > a.date) ? m : a))
// ...
相关文章
相关标签/搜索