【问题标题】:Compare two objects on selected fields in C#在 C# 中比较选定字段上的两个对象
【发布时间】:2023-03-07 00:56:01
【问题描述】:

代码(可能是伪代码):

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# .net comparison


    【解决方案1】:

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

    您可以编写自己的自定义 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,因为您可能希望每个投影具有不同的目标类型。

    (如果可能,您希望为每个场景创建一个比较器。)

    【讨论】:

      【解决方案2】:

      在 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....
      }
      

      【讨论】:

      • 您忽略了一个事实,即此处需要进行两种不同的比较 - 有时仅在 Last 上,有时在 Last 和 First 上。
      • 除了他希望能够指定是否比较您的代码不允许的名字...
      【解决方案3】:

      C# 中的每个类都派生自主类:Object,并且它有一个方法:equals(Object),可以完成这项工作。你应该重写那个方法吗

      class Person {
           ...
           public bool Equals(Object o) {
                return (Person)o.LastName.Equals(this.LastName);
           }
       }
      

      在示例中,您应该检查“o”是否为空,我正在使用姓氏检查是否相等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多