Tôi có một trường hợp mà tôi cần phải lấy một loạt các mặt hàng trên rõ rệt, nhưng nguồn của tôi là một tập hợp các đối tượng với hai thuộc tính, như thế này:thực hiện IEqualityComparer <T> trên một đối tượng với hai thuộc tính trong C#
public class SkillRequirement
{
public string Skill { get; set; }
public string Requirement { get; set; }
}
tôi cố gắng để có được một bộ sưu tập như sau:
SkillRequirementComparer sCom = new SkillRequirementComparer();
var distinct_list = source.Distinct(sCom);
tôi cố gắng để thực hiện một IEqualityComparer<T>
cho điều này, nhưng tôi đã giảm bối rối ở phương pháp GetHashCode()
.
Lớp cho Comparer:
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)
{
//?????
}
}
Thông thường tôi sẽ chỉ sử dụng GetHashCode()
trên một bất động sản, nhưng vì tôi so sánh về hai thuộc tính, tôi là một chút lúng túng về những gì để làm. Tôi có làm bất cứ điều gì sai, hoặc thiếu một cái gì đó thực sự rõ ràng?
Hãy cẩn thận khi sử dụng một 'GetHashCode()' có nguồn gốc từ các trường có thể thay đổi! Nếu bạn đặt đối tượng trong bộ sưu tập băm rồi thay đổi một trong các trường - ouch. Tôi đề nghị làm cho nó không thay đổi. –
Giá trị của thuộc tính là orginally từ cơ sở dữ liệu, trong đó các cột không cho phép null, cũng có kiểm tra chuỗi rỗng hoặc trống trước khi đối tượng được thêm vào danh sách nguồn, vì vậy nó không phải là mối quan tâm: ^) –