使用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
通过更改您的组以返回名称作为选择,并通过键进行分组。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查询工作,它只能针对内存中的数据工作。