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

时间:2011-07-05 15:42:25

标签: c# .net comparison

代码(可能是伪代码):

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;

是否有预定义的方法可以做到这一点?或者我必须自己写一个?

3 个答案:

答案 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。