List<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 ContainsIndexOfLastIndexOf, 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
Posted by 휘사마
,