Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用特定的比较规则设置操作_C#_.net_Linq_Set - Fatal编程技术网

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
几乎肯定会调用它,那么你需要确保你正确地实现它!