比较c#中选定字段上的两个对象
本文关键字:对象 两个 字段 比较 | 更新日期: 2023-09-27 18:01:19
代码(可能是伪代码):
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;
是否有一个预定义的方法来做这个?还是要我自己写?
是否必须将属性名称指定为字符串而不是直接指定?
您可以编写自己的自定义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
,因为你很可能希望每个投影都有不同的目标类型。
(如果可能的话,您希望为每个场景创建一个比较器。)
在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....
}
c#中的每个类都派生自主类:Object,并且有一个方法:equals(Object)来完成这项工作。你是否应该重写
class Person {
...
public bool Equals(Object o) {
return (Person)o.LastName.Equals(this.LastName);
}
}
在示例中,您应该检查"o"是否为空,我正在检查使用lastname的等号