Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HashSet Contains 
:(
    Опции темы
N1ko
Дата 8.12.2012, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Не могу понять поведение метода Contains. Почему после добавления элемента в ХэшСет и выплнения метода Contains первый раз, возвращает True (вызывается и GetHashCode и Equals). После того как я меняю имя  fi.Name = "AA"; Contains уже возвращает False. (вызывается только GetHashCode)Что не так? 

Ps Добавление второго параметра типа IEqualityComparer в метод Contains не предлагать. Можно ли придумать более гибкое решение посредством изменения самого типа?

Код

        private void button1_Click(object sender, EventArgs e)
        {
            var favourites = new HashSet<FavouriteItem>();
            var fi = new FavouriteItem { Id = 1, Name = "A" };
            favourites.Add(fi);
            if (favourites.Contains(fi))
            {
             MessageBox.Show("Exist!!!")
            }
            fi.Name = "AA";
            if (favourites.Contains(fi))
            {
             MessageBox.Show("It doesn't exist? o_O")
            }
        }
        public class FavouriteItem
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public override bool Equals(object obj)
            {
                FavouriteItem test = obj as FavouriteItem;
                return Id.Equals(test.Id) && Name.Equals(test.Name);
            }
            public override int GetHashCode()
            {
                return (Name + Id).GetHashCode();
            }
        }

PM MAIL ICQ   Вверх
VSB
Дата 9.12.2012, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.8.2007

Репутация: 1
Всего: 2



Ну дак всё правильно, сначала сравниваются хеши, если равны  - то сравниваются сами объекты
PM MAIL   Вверх
mihryak
Дата 10.12.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



При добавлении в коллекцию хэш-код объекта запоминается и сохраняется для дальнейшего использования.
В результате объект у тебя знает, что изменился (GetHashCode учитывает Name), а HashSet - не в курсе, он ждёт именно объекта со свойствами {1, "A"}.
И странно ожидать другого - ты, заоверрайдив GetHashCode, сказал, что тебя интересуют не инстансы, а их конкретные свойства.
Обойти такое поведение можно разными способами разной степени корявости, но проблема тут в том, что тебе стоит разобраться сперва, нужно ли тебе сравнивать инстансы или их свойства.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.