C# 使用特定的比较规则设置操作
我有两份清单:C# 使用特定的比较规则设置操作,c#,.net,linq,set,C#,.net,Linq,Set,我有两份清单: List<User> collection1 = new List<User>(); List<User> collection2 = new List<User>(); List collection1=新列表(); 列表集合2=新列表(); 1) 我必须使用LINQ获得两个列表的所有公共项。但是,类User有很多属性,我只想比较FirstName和LastName 2) 如何使用相同的比较规则获取collection1中的项
List<User> collection1 = new List<User>();
List<User> collection2 = new List<User>();
List collection1=新列表();
列表集合2=新列表();
1) 我必须使用LINQ获得两个列表的所有公共项。但是,类User
有很多属性,我只想比较FirstName
和LastName
2) 如何使用相同的比较规则获取collection1
中的项目,而不是collection2
中的项目?用于第一个问题和第二个问题。也就是说:
var common = collection1.Intersect(collection2, new UserEqualityComparer());
var difference = collection1.Except(collection2, new UserEqualityComparer());
当然,在这里,我假设UserEqualityComparer
实现IEqualityComparer
如下:
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();
}
}
class UserEqualityComparer:IEqualityComparer{
公共布尔等于(用户x、用户y){
if(Object.ReferenceEquals(x,y)){
返回true;
}
如果(x==null | | y==null){
返回false;
}
返回x.FirstName==y.FirstName&&x.LastName==y.LastName;
}
public int GetHashCode(用户obj){
if(obj==null){
返回0;
}
返回23*obj.FirstName.GetHashCode()+obj.LastName.GetHashCode();
}
}
用于第一个问题和第二个问题。也就是说:
var common = collection1.Intersect(collection2, new UserEqualityComparer());
var difference = collection1.Except(collection2, new UserEqualityComparer());
当然,在这里,我假设UserEqualityComparer
实现IEqualityComparer
如下:
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();
}
}
class UserEqualityComparer:IEqualityComparer{
公共布尔等于(用户x、用户y){
if(Object.ReferenceEquals(x,y)){
返回true;
}
如果(x==null | | y==null){
返回false;
}
返回x.FirstName==y.FirstName&&x.LastName==y.LastName;
}
public int GetHashCode(用户obj){
if(obj==null){
返回0;
}
返回23*obj.FirstName.GetHashCode()+obj.LastName.GetHashCode();
}
}
是否需要显式定义GetHashCode
方法?柯克:你必须提供一个GetHashCode
的实现来满足IEqualityComparer
接口,而且既然Intersect
和Except
几乎肯定会调用它,那么你需要确保你正确地实现它!是否需要显式定义GetHashCode
方法?柯克:你必须提供一个GetHashCode
的实现来满足IEqualityComparer
接口,而且既然Intersect
和Except
几乎肯定会调用它,那么你需要确保你正确地实现它!