我有两个清单:
List<User> collection1 = new List<User>();
List<User> collection2 = new List<User>();
1)我必须使用LINQ获取两个列表共有的所有项目。但是,课程User
有很多属性,我只想比较FirstName
和LastName
。
2)如何使用相同的比较规则获取collection1
中的项目,而不是collection2
中的项目?
答案 0 :(得分:3)
第一个问题使用Enumerable.Intersect,第二个问题使用Enumerable.Except。即:
var common = collection1.Intersect(collection2, new UserEqualityComparer());
var difference = collection1.Except(collection2, new UserEqualityComparer());
在这里,我当然假设UserEqualityComparer
如此实现IEqualityComparer<User>
:
class UserEqualityComparer : IEqualityComparer<User> {
public bool Equals(User x, User y) {
if (Object.ReferenceEquals(x, y)) {
return true;
}
if (x == null || y == null) {
return false;
}
return x.FirstName == y.FirstName && x.LastName == y.LastName;
}
public int GetHashCode(User obj) {
if (obj == null) {
return 0;
}
return 23 * obj.FirstName.GetHashCode() + obj.LastName.GetHashCode();
}
}