List<T> 에서의 Contains 함수 사용, Dictionary<Tkey,Tvalue> 에서의 ContainsKey,ContainsValue 등의 사용
C#, .NET 2011. 6. 17. 19:20List<T>.Sort() 를 쓰려면 IComparable<T>를 구현하거나 IComparer<T> 를 사용해야 하듯이
Contain 류의 함수를 쓰려면 IEquatable<T> 를 구현하거나 IEqualityComparer<T> 를 사용해야한다.
하지만 왠지 IComparable<T> 나 IComparer<T> 만큼 깔끔하게는 잘 안되는것 같고
msdn을 뒤지던 끝에 이런걸 찾아냈다.
We recommend that you derive from the EqualityComparer<T> class instead of implementing the IEqualityComparer<T> interface, because the EqualityComparer<T> class tests for equality using the IEquatable<T>.Equals method instead of the Object.Equals method. This is consistent with the Contains, IndexOf, LastIndexOf, and Remove methods of the Dictionary<TKey, TValue> class and other generic collections.
이것으로 만들어본 예제 코드는 아래와 같다.
public class Sorted {
public int min;
public int max;
public int blank;
public bool unique;
public Sorted(int min,int max,int blank,bool unique) {
this.min = min;
this.max = max;
this.blank = blank;
this.unique = unique;
}
}
public class SortedComparer : EqualityComparer<Sorted> {
public override bool Equals(Sorted x, Sorted y)
{
if (x.min == y.min && x.max == y.max && x.unique == y.unique && x.blank == y.blank)
return true;
else
return false;
}
public override int GetHashCode(Sorted obj)
{
return obj.min ^ obj.max ^ obj.blank;
}
}
sorted_dict = new Dictionary<Sorted, long>(new SortedComparer());
Sorted trykey = new Sorted(min, max, blank, unique);
if(sorted_dict.ContainsKey(trykey))
return sorted_dict[trykey];
이런식으로 써주면 된다.
GetHashCode 는 override 하라고 만들어놓은 메쏘드 같다.
적절하게 필드값들을 XOR 시켜서 만들어주면 되는 것 같다.
Dictionary 같은데에서 hashing 을 하는데 사용하는듯.
'C#, .NET' 카테고리의 다른 글
event (0) | 2011.06.17 |
---|---|
I/O 를 할 수 있는 각종 Stream Class 들, 자동 닫기, 객체 직렬화 (0) | 2011.06.17 |
textbox auto scroll 가장 하단으로 내리기 (0) | 2011.06.17 |
List 의 정렬 ( Sort() ) (0) | 2011.06.17 |
property (0) | 2011.06.17 |