我需要避免在列表中重复使用以下代码。我想知道除了item.id之外是否有任何选项可以将对象比较为(item = findobject)。我不想在这里输入整个房产列表。请建议一个更好的方法。
var result =(obj.Find(item => (item== findObject)));
答案 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运算符。所以你将编写一次比较逻辑,然后简单地使用“==”来比较它们。