Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测重复记录,仅选择第一个并使用LINQ/C计数#_C#_Linq_Duplicates - Fatal编程技术网

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

C# 检测重复记录,仅选择第一个并使用LINQ/C计数#,c#,linq,duplicates,C#,Linq,Duplicates,我正在寻找一些关于使用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

我正在寻找一些关于使用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
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
我的目标是基于两个字段检测重复项,在本例中为“name”和“email”

所需输出是如下所示的客户列表:

  • 重复的客户只能显示一次
  • 应显示类似记录的数量
  • 所需的重复列表:-

    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
    
    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记录,可以使用

    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

    输出ID很奇怪,A公司的正确ID是多少?@RohitVyas这些解决方案会删除重复记录,但不会计算每种情况下的重复记录数。
    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
    };