使用Linq在list中获取基于2个字段的重复条目列表

本文关键字:字段 列表 2个 Linq list 获取 使用 | 更新日期: 2023-09-27 18:20:28

我正在使用以下Linq来确定在某些自定义验证过程中,我的列表中是否有任何无效条目-我想知道是否有人根据他们工作的公司被分配了相同的编号,这些公司运行良好:

var duplicates = Persons.GroupBy(x => 
                new { x.Number, x.CompanyId}, (key) => new { key.Number, key.CompanyId })
                .Where(y => y.Count() > 1);

对于一类简单的人:

class Person
{
    public string Name { get; set; }
    public int Number { get; set; }
    public int CompanyId { get; set; }
}

所以构建一些测试数据:

List<Person> Persons = new List<Person>();
// add people (users would do this!)
Persons.Add(new Person() { Name = "Person 1", Number = 1, CompanyId = 1 }); // invalid
Persons.Add(new Person() { Name = "Person 2", Number = 2, CompanyId = 1 });
Persons.Add(new Person() { Name = "Person 3", Number = 3, CompanyId = 1 });
Persons.Add(new Person() { Name = "Person 4", Number = 1, CompanyId = 1 }); // invalid
Persons.Add(new Person() { Name = "Person 5", Number = 2, CompanyId = 2 }); // invalid
Persons.Add(new Person() { Name = "Person 6", Number = 2, CompanyId = 2 }); // invalid

检查是否有重复并处理:

var duplicates = Persons.GroupBy(x => 
                new { x.Number, x.CompanyId}, (key) => new { key.Number, key.CompanyId })
                .Where(y => y.Count() > 1);
if (duplicates.Any())
{
    // build a string
}

我想做的是获得一个无效条目的列表并通知用户。因此,在上述情况下,我希望输出以下文本:

  • 人员1和人员4被分配给#1公司的相同编号#1
  • 人员5和人员6被分配给#2公司的相同编号#2

使用Linq在list中获取基于2个字段的重复条目列表

通过更改您的组以返回名称作为选择,并通过键进行分组。String.Join将合并列表

var duplicates = Persons
    .GroupBy(key => new { key.Number, key.CompanyId }, a=>a.Name)
    .Where(y => y.Count() > 1);
var sb = new StringBuilder();
foreach (var duplicate in duplicates)
{
    sb.AppendLine(String.Format("{0} have been assigned the same Number {1} for Company #{2}",
                                String.Join(" and ", duplicate), duplicate.Key.Number,
                                duplicate.Key.CompanyId));
}
var message = sb.ToString();

现在检查消息是否为空,以了解是否有重复的语句而不是Any()语句。

我发现使用查询语法而不是流畅的语法更容易正确地编写分组LINQ查询。以下是一个查询,它将为您提供所需的字符串:

from p in Persons   
group p by new { p.Number, p.CompanyId } into g
where g.Count () > 1
select string.Format(
    "{0} have been assigned the same number #{1} for company {2}",
    string.Join(" and ", g.Select (x => x.Name)),
    g.Key.Number,
    g.Key.CompanyId);

请注意,该查询不能作为LINQ to SQL/Entities查询工作,它只能针对内存中的数据工作。