C# 使用linq将特定的非重复记录获取到列表

C# 使用linq将特定的非重复记录获取到列表,c#,linq,C#,Linq,我一直在用这个: return myListOfContacts.DistinctBy(e => e.Id).Where(e => e.CompanyId == companyId).ToList(); 它根据请求返回一个不同的列表。问题是,当记录重复时,返回的记录是列表中的第一个记录 例如,如果我的联系人中有以下内容: [Id-ContactId-Name-FlagIWantThisOne] 1 - 99 - John - true 2 - 56 - Mike - false 2

我一直在用这个:

return myListOfContacts.DistinctBy(e => e.Id).Where(e => e.CompanyId == companyId).ToList();
它根据请求返回一个不同的列表。问题是,当记录重复时,返回的记录是列表中的第一个记录

例如,如果我的联系人中有以下内容:

[Id-ContactId-Name-FlagIWantThisOne]

1 - 99 - John - true
2 - 56 - Mike - false
2 - 56 - Mike - true
3 - 13 - Dave - false
它返回3条记录:

约翰、迈克和戴夫

但我想要的“迈克”唱片是那张有国旗的真唱片

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

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

您可以尝试:

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


按Id分组。然后,按组降序排序(true>false),并从每个组中选取第一个。首先对列表进行排序应该会有所帮助。此外,出于性能原因,我将首先使用where子句:

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

尝试反转列表:

return myListOfContacts
    .Reverse()
    .DistinctBy(e => e.Id)
    .Where(e => e.CompanyId == companyId)
    .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的记录,而忽略其他记录。”