如何比较模型的两个对象?
How to compare two object of model?
我在缓存中有搜索模型的对象(我从 get-query 中保存了他)并且我通过 get-request 获得了其他相同模型的对象。
我想比较这些对象,但如果我不更改参数,无论如何我有 "false" 结果代码:
public class SearchO
{
public List<SellsLive> Data;
public SellsLiveSearch Query;
}
[HttpGet]
public ActionResult Result(SellsLiveSearch ObjectModelFromQuery, string Ser)
{
if (System.Web.HttpContext.Current.Cache[Ser] != null)
{SearchO ObjectModelFromCache = (SearchO)System.Web.HttpContext.Current.Cache[Ser];
if(ObjectModelFromCache.Query==ObjectModelFromQuery)
...
}
为什么会发生这种情况?
你可以使用下面的代码来比较两个对象
MyClass object1 = new MyClass("test");
MyClass object2 = new MyClass("test");
object1.equals(object2);
覆盖 class
中的 equals 方法
它return false 因为你正在比较引用类型并且对象不是同一个引用(即使通过所有 属性 值可能是相同的)。
ObjectModelFromQuery
是在您的操作方法中初始化的 SellsLiveSearch
的新实例。 ObjectModelFromCache.Query
是从会话中检索到的 SellsLiveSearch
的另一个实例。
如果 SellsLiveSearch
包含唯一标识对象的(比如)ID
属性,那么您可以使用 if(ObjectModelFromCache.Query.ID == ObjectModelFromQuery.ID)
。否则,您需要覆盖 Equals()
和 GetHashCode()
方法,以及 SellsLiveSearch
的 ==
和 !=
运算符。有关详细示例,请参阅 Guidelines for Overloading Equals() and Operator == (C# Programming Guide)。
旁注:通常,您不应将复杂对象传递给 GET 方法。除了这会创建丑陋的查询字符串之外,您还可以轻松地超出查询字符串字符限制并引发异常。此外,如果 SellsLiveSearch
的类型包含复杂对象或集合的属性,绑定将失败并且这些属性将为 null
。而是传递标识对象的 ID 值。
public ActionResult Result(int ID, string Ser)
{
...
if(ObjectModelFromCache.Query.ID == ID)
{
....
}
}
使用 equals 方法是正确的方法。尽管您应该覆盖 class 中的 Equal 方法并匹配等价的 Unique 值。
public class MyObject
{
public int Id {get;set;}
public overrides bool Equals(object obj)
{
if(obj==null)
return false;
return (MyObject)obj).Id.Equals(this.Id)
}
}
我希望这是有道理的。
我在缓存中有搜索模型的对象(我从 get-query 中保存了他)并且我通过 get-request 获得了其他相同模型的对象。
我想比较这些对象,但如果我不更改参数,无论如何我有 "false" 结果代码:
public class SearchO
{
public List<SellsLive> Data;
public SellsLiveSearch Query;
}
[HttpGet]
public ActionResult Result(SellsLiveSearch ObjectModelFromQuery, string Ser)
{
if (System.Web.HttpContext.Current.Cache[Ser] != null)
{SearchO ObjectModelFromCache = (SearchO)System.Web.HttpContext.Current.Cache[Ser];
if(ObjectModelFromCache.Query==ObjectModelFromQuery)
...
}
为什么会发生这种情况?
你可以使用下面的代码来比较两个对象
MyClass object1 = new MyClass("test");
MyClass object2 = new MyClass("test");
object1.equals(object2);
覆盖 class
中的 equals 方法它return false 因为你正在比较引用类型并且对象不是同一个引用(即使通过所有 属性 值可能是相同的)。
ObjectModelFromQuery
是在您的操作方法中初始化的 SellsLiveSearch
的新实例。 ObjectModelFromCache.Query
是从会话中检索到的 SellsLiveSearch
的另一个实例。
如果 SellsLiveSearch
包含唯一标识对象的(比如)ID
属性,那么您可以使用 if(ObjectModelFromCache.Query.ID == ObjectModelFromQuery.ID)
。否则,您需要覆盖 Equals()
和 GetHashCode()
方法,以及 SellsLiveSearch
的 ==
和 !=
运算符。有关详细示例,请参阅 Guidelines for Overloading Equals() and Operator == (C# Programming Guide)。
旁注:通常,您不应将复杂对象传递给 GET 方法。除了这会创建丑陋的查询字符串之外,您还可以轻松地超出查询字符串字符限制并引发异常。此外,如果 SellsLiveSearch
的类型包含复杂对象或集合的属性,绑定将失败并且这些属性将为 null
。而是传递标识对象的 ID 值。
public ActionResult Result(int ID, string Ser)
{
...
if(ObjectModelFromCache.Query.ID == ID)
{
....
}
}
使用 equals 方法是正确的方法。尽管您应该覆盖 class 中的 Equal 方法并匹配等价的 Unique 值。
public class MyObject
{
public int Id {get;set;}
public overrides bool Equals(object obj)
{
if(obj==null)
return false;
return (MyObject)obj).Id.Equals(this.Id)
}
}
我希望这是有道理的。