[C#] Переопределение метода Equals

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 24 Jul 2013.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Всем доброго времени суток, что то я не могу додуплить переопределение метода Equals, суть следующая, есть класс:
    Code:
    public class Item
    {
         private string param1;
         private string param2;
    
         public Item(string p1, string p2)
         {
              this.param1 = p1;
              this.param2 = p2;
         }
    }
    
    Который хранит в себе некую информацию, а точнее параметр 1 и параметр 2.

    Так же имеется еще один класс, который содержит в себе List<Item>:
    Code:
    public class Good
    {
         private List<Item> LT;
    
         public Good()
         {
              LT = new List<Item>();
         }
    
         public void SetParam(string s1, string s2)
         {
              LT.Add(new Item(s1, s2));
         }
    }
    
    Мне нужно сравнение двух "Item"-ов, ну как то не могу догнать до конца как переопределить Equals в моём случае..в msdn немного замудрёнyый пример там класс унаследует класс и в нём делается переопределение...

    Ну вот собственно ссыль - http://msdn.microsoft.com/ru-ru/library/ms173147%28v=vs.80%29.aspx

    P.S. В Delphi я передавал в List<T> -> ICompare, и в функции Compare делал сравнение Item'ов...
     
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я не понял, что ты хочешь сравнить - два класса что ли? Или переменные стринги? Как то я даже завис...
     
  3. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Привет. По умолчанию equals сравнивает ссылки.
    Если тебе нужно сравнивать по значениям членов класса, то можно так:
    PHP:
            public override bool Equals(object obj)
            {
                return 
    obj is Item
                       
    && ((Itemobj).param1 == this.param1
                       
    && ((Itemobj).param2 == this.param2;
            }

            public 
    override int GetHashCode()
            {
                return 
    param1.GetHashCode() ^ param2.GetHashCode();
            }
    тогда
    PHP:
    new Item("str1""str2").Equals(new Item("str1""str2"))
    вернет true
    еще можно операторы == и != переопределить:
    PHP:
            public static bool operator ==(Item item1Item item2)
            {
                return 
    object.ReferenceEquals(item1item2) || item1.Equals(item2);
            }

            public static 
    bool operator !=(Item item1Item item2)
            {
                return !(
    item1 == item2);
            }
    писал быстро, возможно надо еще добавить проверку на null'ы.
     
    #3 GhostOnline, 25 Jul 2013
    Last edited: 25 Jul 2013
  4. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    GhostOnline
    Привет, ну переопределяем Equals в Item, но IndexOf \ Contains отказываются работать))) А ты в icq больше не появляешься? :)

    только переменные, нужно заставить сравнивать..и затем выполнять поиск по IndexOf
     
    #4 Kandi, 25 Jul 2013
    Last edited: 25 Jul 2013
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    шо, правда?

    да сегодня только вот был. тебя там не видел. кстати мы же вроде эту тему с поиском в списке уже обсуждали, разве нет?
     
  6. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    GetHashCode сделал как написано?

    зацени paste2.org, удобнее он
     
    #6 Kairos, 25 Jul 2013
    Last edited: 25 Jul 2013
    1 person likes this.
  7. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    днём на работе был просто) так ну щас я еще раз проверю просто список загружаю в List<T> знаю, что две строки одинаковые...а прога в лист добавляет всё равно. Да ты мне показывал как переопределять метод..ну ты пример давал class1 ... class2 унаследует class1 и переопределяется метод) я немного запутался в том примере)))

    Да, вот только не понял зачем еще GetHashCode() переопределять..?
    че за пародия на pastbin?
     
  8. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Часто для сравнения именно GetHashCode используют, наример если нужно дубликаты удалить.

    У pastbin2 интерфейс менее загруженный, чем у оригинала. Люблю минимализм.
     
  9. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Так, ну наверное я догнал почему False у меня) я то храню данные в массиве байтов. =\ я думал он сравнивает одинаковый массив байтов и даёт True при одинаковых значениях..видать нет =)

    Как сравнить два массива байтов?
     
    #9 Kandi, 26 Jul 2013
    Last edited: 26 Jul 2013
  10. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    совсем запутал. спрашивал про IndexOf|Contains, а оказалось сравнение массивов.

    PHP:
    byte[] arr1 = new byte[]{1,2,3}, 
            
    arr2 = new byte[]{1,2,3};
    bool b arr1.SequenceEqual(arr2);
     
  11. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    ну я тут от руки писал и написал string param1 и param2...а у меня массив байтов.. т.е. byte[] param1 и byte[] param2. Со строками Equals заработал на ура.

    Ну теперь и с массивом байт норм работает :)
     
    #11 Kandi, 26 Jul 2013
    Last edited: 26 Jul 2013