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的记录,而忽略其他记录。”