如何比较不包括单个对象属性的两个对象?

时间:2011-03-18 07:38:23

标签: c#

我需要避免在列表中重复使用以下代码。我想知道除了item.id之外是否有任何选项可以将对象比较为(item = findobject)。我不想在这里输入整个房产列表。请建议一个更好的方法。

var result =(obj.Find(item => (item== findObject)));            

4 个答案:

答案 0 :(得分:3)

是的,重新实现GetHashCode()。但是你需要一些CS知识才能做到正确,这不是一件容易的事。

Equals就此而言。

答案 1 :(得分:1)

您可以重写Equals方法并在那里明确指定比较属性的列表。

答案 2 :(得分:1)

只是一个选项:您可以使用反射来获取属性列表,然后在对象之间进行比较,例如:

public static bool CompareExcept<T>(T first, T second, params string[] excludeNames)
{
  foreach (PropertyInfo pi in typeof(T).GetProperties())
  {
    if (excludeNames.Contains(pi.Name)) // case sensitive
      continue;
    object propFirst = pi.GetGetMethod().Invoke(first, null);
    object propSecond = pi.GetGetMethod().Invoke(second, null);

    if (propFirst == null)
    {
      if (propSecond != null)
        return false;
    }
    else
    {
      if (!propFirst.Equals(propSecond))
        return false;
    }
  }
  return true;
}

与反射相关的所有常见警告都适用,所以这很慢,最好在紧密循环中避免,但它相对容易使用

Person p1 = new Person { ID = 1, FirstName = "John", LastName = "Doe", Age = 50 };
Person p2 = new Person { ID = 2, FirstName = "John", LastName = "Doe", Age = 50 };
Person p3 = new Person { ID = 3, FirstName = "Jane", LastName = "Roe", Age = 50 };
Person p4 = new Person { ID = 4, FirstName = "John", LastName = "Doe", Age = 60 };

bool areSame = CompareExcept(p1, p2, "ID"); // True
areSame = CompareExcept(p1, p2, "Age"); // False
areSame = CompareExcept(p1, p3, "ID"); // False
areSame = CompareExcept(p1, p3, "ID", "FirstName", "LastName"); // True
areSame = CompareExcept(p1, p4, "ID"); // False
areSame = CompareExcept(p1, p4, "ID", "Age"); // True

如果你需要比较很多类型,这很有用。但是,如果这是一次性的事情,你最好明确地比较所有其他领域。

答案 3 :(得分:0)

如果您拥有要查找的对象类型,我建议您重载Equals运算符。所以你将编写一次比较逻辑,然后简单地使用“==”来比较它们。