使用LINQ/C#检测重复记录,仅选择第一个并计数

7

我希望您能协助设计一个使用C#/LINQ的查询,以满足以下要求:

我有一组公司:

Id  Name                Email       Address

1   Company A         a@a.com       abc

2   Company B         b@b.com       abc

3   Company C         c@c.com       abc

4   Company D         d@d.com       abc

5   Company A         a@a.com       abc

我的目标是基于两个字段(在此示例中为“名称”和“电子邮件”)检测重复项。

期望的输出是以下客户列表:

  1. 只应显示重复的客户一次
  2. 应该显示相似记录的数量。

期望的重复项列表:-

Id  Qty Name        Email       Address

1   2   Company A       a@a.com     abc (Id/details of first)

2   1   Company B       b@b.com     abc

3   1   Company C       c@c.com     abc

4   1   Company D       d@d.com     abc

输出id很奇怪,公司A的正确id是什么? - Johan Larsson
https://dev59.com/7XI-5IYBdhLWcg3w8NOB - Rohit Vyas
2
@RohitVyas 这些解决方案可以删除重复记录,但不能计算每种情况下重复记录的数量。 - Mohammad Banisaeid
2个回答

9
如果您明确希望在每组重复记录中使用最低ID记录,则可以使用。
var duplicates = companies
    .GroupBy(c => new { c.Name, c.Email })
    .Select(g => new { Qty = g.Count(), First = g.OrderBy(c => c.Id).First() } )
    .Select(p => new
        {
            Id = p.First.Id,
            Qty = p.Qty,
            Name = p.First.Name,
            Email = p.First.Email,
            Address = p.First.Address
        });

如果您不关心使用哪个记录的值,或者如果您的源已按ID(升序)排序,则可以删除 OrderBy 调用。


4
from c in companies
group c by new { c.Name, c.Email } into g
select new
{
   Id = g.First().Id,
   Qty = g.Count(),
   Name = g.Key.Name,
   Email = g.Key.Email,
   Address = g.First().Address
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接