我一直在用这个:
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条记录:
John,Mike和Dave。
但我想要的“Mike”记录是旗帜为真的那个。
总之,如果记录是重复的,那么列表应该返回标志设置为true的那个并忽略其他记录。
我在那里得到了distinctBy
,但它返回了它在列表中找到的第一个。
答案 0 :(得分:4)
您可以尝试:
myListOfContacts.GroupBy(e => e.Id)
.Select(g => g.OrderByDescending(r => r.FlagIwantThisOne).First())
.ToList();
逻辑是:
按ID分组。然后,按组降序排序(true> false),并从每个组中取出第一个。
答案 1 :(得分:2)
首先订购清单应该有所帮助。另外,出于性能原因,我首先将where子句放在其中:
return myListOfContacts.Where(e => e.CompanyId == companyId)
.OrderBy(e => e.Flag)
.DistinctBy(e => e.Id)
.ToList();
答案 2 :(得分:2)
不是对分组元素进行排序,而是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的那个并忽略其他记录。“
答案 3 :(得分:0)
尝试撤消列表:
return myListOfContacts
.Reverse()
.DistinctBy(e => e.Id)
.Where(e => e.CompanyId == companyId)
.ToList();
但我真的认为你应该避免重复记录。