比较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;

是否有一个预定义的方法来做这个?还是要我自己写?

比较c#中选定字段上的两个对象

是否必须将属性名称指定为字符串而不是直接指定?

您可以编写自己的自定义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的等号