【发布时间】:2014-09-03 03:39:20
【问题描述】:
我正在使用以下 Linq 来确定在某些自定义验证期间我的列表中是否有任何无效条目 - 我想知道是否有人根据他们工作的公司分配了相同的编号:
var duplicates = Persons.GroupBy(x =>
new { x.Number, x.CompanyId}, (key) => new { key.Number, key.CompanyId })
.Where(y => y.Count() > 1);
对于一个简单的 Person 类:
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 分配了相同的编号 #1,人员 1 和人员 4。
- 已为公司 #2 分配了相同的编号 #2,第 5 人和第 6 人。
【问题讨论】:
-
你有没有想过... Persons.Where(p => (p.Number == p.CompanyId)) 然后对结果进行相应的分组
-
编号 == 公司?这不起作用,因为 Number 与 Company 无关。每个公司都有自己的编号系统。 Number 和 Company 必须为 GroupBy 中的键。
-
你应该澄清为什么Person Number或CompanyId无效,是因为重复的号码还是什么!