代码(可能是伪代码):
Person p1 = new Person { First = "John", Last = "Smith" };
Person p2 = new Person { First = "Jane", Last = "Smith" };
我正在寻找一种方法:
bool b1 = Person.CompareOn({"First", "Last"}, p1, p2) // false;
bool b2 = Person.CompareOn({"Last"} , p1, p2) // true;
是否有预定义的方法可以做到这一点?或者我必须自己写一个?
答案 0 :(得分:3)
您是否必须将属性名称指定为字符串而不是直接?
您可以编写自己的自定义IEqualityComparer<T>
实现,该实现需要进行投影 - 然后还可以使用AndAlso
方法进行其他投影。我在MiscUtil中有第一部分,其余部分不应该太难使用。
您可以使用以下内容:
// The first argument here is only for the sake of type inference
var comparer = PropertyEqualityComparer.WithExample(p1, p => p.First)
.AndAlso(p => p.Last);
bool equal = comparer.Equals(p1, p2);
或:
var comparer = PropertyEqualityComparer<Person>.Create(p1, p => p.First)
.AndAlso(p => p.Last);
bool equal = comparer.Equals(p1, p2);
很遗憾,您不能在此处使用params
,因为您可能希望每个投影都有不同的目标类型。
(如果可能,您希望为每个场景创建一个比较器。)
答案 1 :(得分:0)
在Person类中:
public virtual bool Equals(Person obj){
if (obj == null) return false;
if (Equals(First, obj.First) == false) return false;
if (Equals(Last, obj.Last) == false) return false;
return true;
}
然后你可以说:
if(person1.Equals(person2){
blah....
}
答案 2 :(得分:0)
C#中的每个类派生自主类:Object,并且它有一个方法:equals(Object),这样做。是否应该覆盖该方法
class Person {
...
public bool Equals(Object o) {
return (Person)o.LastName.Equals(this.LastName);
}
}
在示例中,您应检查“o”是否为null,我正在使用lastname检查equals。