使用 linq 将特定不同的记录获取到列表

本文关键字:记录 获取 列表 linq 使用 | 更新日期: 2023-09-27 18:31:48

我一直在使用这个:

return myListOfContacts.DistinctBy(e => e.Id).Where(e => e.CompanyId == companyId).ToList();

它会根据请求返回不同的列表。问题是,当记录重复时,返回的记录是列表中的第一个。

例如,如果我的联系人中有这些:

[ID - 联系人 ID - 名称 - 标志我这个一]

1 - 99 - John - true
2 - 56 - Mike - false
2 - 56 - Mike - true
3 - 13 - Dave - false

它返回 3 条记录:

约翰、迈克和戴夫。

但是我想要的"迈克"记录是带有标志的记录。

总之,如果记录重复,则列表应返回标志设置为 true 的记录,并忽略其他记录。

我在那里得到了distinctBy,但它正在返回它在列表中找到的第一个。

使用 linq 将特定不同的记录获取到列表

你可以试试:

myListOfContacts.GroupBy(e => e.Id)
                .Select(g => g.OrderByDescending(r => r.FlagIwantThisOne).First())
                .ToList();

逻辑是:

按 ID 分组。然后,对组降序(真>假)进行排序,并从每个组中获取第一个。

首先对列表进行排序应该会有所帮助。另外,出于性能原因,我会将 where 子句放在第一位:

return myListOfContacts.Where(e => e.CompanyId == companyId)
                       .OrderBy(e => e.Flag)
                       .DistinctBy(e => e.Id)
                       .ToList();

与其对分组元素进行排序,这是 O(N*log(N)) 时间复杂度,您可以使用简单的 O(N) 搜索和回退到原始逻辑:

return myListOfContacts
    .Where(e => e.CompanyId == companyId)
    .GroupBy(e => e.Id, (key, elements) =>
        elements.FirstOrDefault(e => e.FlagIWantThisOne) ?? elements.First())                   .OrderBy(e => e.Flag)
    .ToList();

它基本上是这样做的,如果一条记录是重复的,列表应该返回标志设置为 true 的记录,而忽略其他记录。

尝试反转列表:

return myListOfContacts
    .Reverse()
    .DistinctBy(e => e.Id)
    .Where(e => e.CompanyId == companyId)
    .ToList();

但我真的认为你应该避免重复记录。