繁体   English   中英

使用linq将特定的不同记录添加到列表中

[英]Getting specific distinct record to a list using linq

我一直在用这个:

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

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

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

[Id - ContactId - 名称 - 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();

而不是排序分组元素,即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();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM