Iterators And Comparators - Problem 7 *Equality Logic
Здравейте колеги,
някой би ли могъл да ми помогне със Iterators And Comparators - Problem 7 *Equality Logic задача тъй като се опитах да я направя, но не стигнах до никъде. Ще съм благодарен :)
Здравейте колеги,
някой би ли могъл да ми помогне със Iterators And Comparators - Problem 7 *Equality Logic задача тъй като се опитах да я направя, но не стигнах до никъде. Ще съм благодарен :)
HashSet -ете използват EqualityComparer, за да знаят дали да добавят даден елемент. Дефолтният comparer използва референции, но те не те устройват по условието на задачата,затова трябва да override -неш методите Equals(Object obj) и GetHashCode(), които по принцип са методи на System.object.
Ето един пример за това:
public override bool Equals(object other)
{
var y = other as Person;
return this.Name == y.Name && this.Age == y.Age;
}
public override int GetHashCode()
{
var hashCode = this.Name.Length * 10000;
hashCode = this.Name.Aggregate(hashCode, (current, letter) => current + letter);
hashCode += this.Age * 10000;
return hashCode;
}
За SortedSet -ете се нуждаеш или да имплементираш IComparable<Person> или да си направиш някакъв custom comparer имплементиращ IComparable<Person>, което се прави в задачите преди 6-та.
Успех.
Мерси много колега!
Може ли все пак да получа пълно решение на задачата?
Ето едно решение: Problem07. Equality Logic
current, letter са произволни в случая думи, които се използват в анонимен Action delegate от extension метода Aggregate, който е равносилен на:
Hashcode се използва в структури от данни като hashset и dictionary, които използват Hash maps за да мапват стойности на съдържаните ключове. Този начин на мапване дава мигновен достъп до елементи(сложност на достъпване О(1)). Идеята е да е уникален за всеки ключ, или да се повтаря при много голям брой ключове, например 2 на 31.
В този случай просто порядъците на отделните стойности са достатъчно различни(Name-a се умножава с 10000, age-a s 10000000, a буквите само се прибавят.Така при дадените ограничения за дължина на името, стойността която се прибавя винаги ще е по-малка от минималната възможна стойност която ще се получи от възрастта, същото и за сборната стойност от буквите спрямо името. Така всеки person с поне 1 разлика в пропърти от друг person ше има различен hashcode от него и в hashset-а ще бъдат добавени и двата. От друга страна ако има person-и с еднакви пропъртита ще се добавя само първият, а ако се използваше дефолтният equalitycomparer, който сравнява по референции, щяха да се добавят и двата, защото имат различни адреси.