Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

stambi4a avatar stambi4a 126 Точки

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-та.

Успех.

2
Nani15 avatar Nani15 12 Точки

Мерси много колега!

0
24/07/2016 22:06:03
Nani15 avatar Nani15 12 Точки

Може ли все пак да получа пълно решение на задачата?

0
stambi4a avatar stambi4a 126 Точки

Ето едно решение: Problem07. Equality Logic

current, letter са произволни в случая думи, които се използват в анонимен Action delegate от extension метода Aggregate, който е равносилен на:

foreach(var letter in this.Name)
{
    hashCode += letter;
}

Hashcode се използва в структури от данни като hashset и dictionary, които използват Hash maps за да мапват стойности на съдържаните ключове. Този начин на мапване дава мигновен достъп до елементи(сложност на достъпване О(1)). Идеята е да е уникален за всеки ключ, или да се повтаря при много голям брой ключове, например 2 на 31.

В този случай просто порядъците на отделните стойности са достатъчно различни(Name-a се умножава с 10000, age-a s 10000000, a буквите само се прибавят.Така при дадените ограничения за дължина на името, стойността която се прибавя винаги ще е по-малка от минималната възможна стойност която ще се получи от възрастта, същото и за сборната стойност от буквите спрямо името. Така всеки person с поне 1 разлика в пропърти от друг person ше има различен hashcode от него и в hashset-а ще бъдат добавени и двата. От друга страна ако има person-и с еднакви пропъртита ще се добавя само първият, а ако се използваше дефолтният equalitycomparer, който сравнява по референции, щяха да се добавят и двата, защото имат различни адреси.

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.