C# 检测重复记录,仅选择第一个并使用LINQ/C计数#
我正在寻找一些关于使用C#/LINQ设计查询的帮助,以满足以下要求: 我有一份公司名单:-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
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
};