2

C#:我有一个对象集合。T 有 2 个属性。属性 A 和属性 B。此集合需要遵守的规则是 A 和 B 的值组合在集合中必须是唯一的。换句话说,A 和 B 需要作为一个复合主键。

我可以使用 Linq 中的操作来检查这种情况吗?我希望它会像

if (items.Select(x => x.Name).Distinct().Count() != items.Select(x => x.Name).Count())

上面的语句是我如何检查集合中是否有具有重复名称的项目,但我不知道如何为多个属性执行此操作。

4

3 回答 3

12

使用匿名类型来选择复合键,例如

int totalCount = items.Count();
int distinctCount = items.Select(x => new { x.Name, x.Other })
                         .Distinct()
                         .Count();

匿名类型会根据它们的属性(以及这些属性类型的默认相等比较器)自动实现相等和哈希码。

于 2009-10-27T11:49:31.477 回答
0

您可以注入自己的相等比较器。示例在这里: http ://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/c5b71644-b2d9-422b-b7fe-ef3bef30bbac/

于 2009-10-27T11:48:52.320 回答
0

只需选择一个新的匿名对象

var keys = items.Select( x => new { x.Name, x.Other } ).ToList();

if (keys.Distinct().Count() != keys.Count())
{
 ...
}
于 2009-10-27T11:51:41.660 回答