Mam przypadek, w którym muszę złapać kilka przedmiotów na odrębne, ale moje źródło jest zbiorem obiektów z dwóch właściwości, na przykład:wykonawcze IEqualityComparer <T> na obiekt z dwóch właściwości w C#
public class SkillRequirement
{
public string Skill { get; set; }
public string Requirement { get; set; }
}
próbuję dostać zbiór następująco:
SkillRequirementComparer sCom = new SkillRequirementComparer();
var distinct_list = source.Distinct(sCom);
starałem się wdrożyć IEqualityComparer<T>
za to, ale upadłem zakłopotany w sposobie GetHashCode()
.
Klasa dla porównywarka:
public class SkillRequirementComparer : IEqualityComparer<SkillRequirement>
{
public bool Equals(SkillRequirement x, SkillRequirement y)
{
if (x.Skill.Equals(y.Skill) && x.Requirement.Equals(y.Requirement))
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(SkillRequirement obj)
{
//?????
}
}
Normalnie bym po prostu użyć GetHashCode()
na własność, ale ponieważ jestem porównując na dwie właściwości, jestem trochę w rozterce co zrobić. Czy robię coś złego, czy też brakuje czegoś naprawdę oczywistego?
Zachowaj ostrożność podczas używania 'GetHashCode()', który pochodzi od zmiennych zmiennych! Jeśli umieścisz obiekt w kolekcji mieszania, zmień jedno z pól - ouch. Proponuję uczynienie go niezmiennym. –
Wartości właściwości są pierwotnie z bazy danych, gdzie kolumny nie pozwalają na wartości null, są również sprawdzane dla pustych lub pustych ciągów przed dodaniem obiektu do listy źródłowej, więc nie stanowi to problemu: ^) –