2015-02-26 2 views
0

У меня есть объект поисковой модели в кеше (я спас его от get-query), и я получаю с помощью запроса-запроса другой объект той же модели.Как сравнить два объекта модели?

Я хочу, чтобы сравнить эти объекты, но если я не изменить parametrs, во всяком случае у меня есть результат «ложный» в этом коде:

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

Почему это может произойти?

ответ

1

Это возвращает ложь, потому что вы сравниваете ссылочные типы и объекты не та же ссылка (даже через все значения свойств могут быть одинаковыми).

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. Вместо этого передайте идентификационное значение, идентифицирующее объект.

public ActionResult Result(int ID, string Ser) 
{ 
    ... 
    if(ObjectModelFromCache.Query.ID == ID) 
    { 
    .... 
    } 
} 
0

вы можете использовать следующий код для сравнения два объекта

MyClass object1 = new MyClass("test"); 
    MyClass object2 = new MyClass("test"); 

    object1.equals(object2); 
+0

Я попытался 'ObjectModelFromCache.Query.equals (ObjectModelFromQuery)' результата "ложь". Это правильно или нет? Что такое («тест»)? – forven

+0

false означает, что оба объекта не одинаковы. – DeepakJ

0

Override Равных методы в классе

0

используя метод равных - это правильный подход. Хотя вы должны переопределить метод Equal в своем классе и сопоставить уникальное значение для эквивалентности.

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) 
    } 
} 

Надеюсь, это имеет смысл.

Смежные вопросы