2010-07-25 9 views
2

이것은 매우 간단한 질문 일 것입니다. 난 단순히 컬렉션에서 중복 바이트 []를 제거하려고 해요.컬렉션에서 중복 바이트 [] 삭제

기본 동작은 참조를 비교하는 것이므로 IEqualityComparer를 만드는 것이 효과적 일지 모르지만 그렇지 않습니다.

HashSet과 LINQ의 Distinct()를 사용해 보았습니다.

샘플 코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace cstest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var l = new List<byte[]>(); 
      l.Add(new byte[] { 5, 6, 7 }); 
      l.Add(new byte[] { 5, 6, 7 }); 
      Console.WriteLine(l.Distinct(new ByteArrayEqualityComparer()).Count()); 
      Console.ReadKey(); 
     } 
    } 

    class ByteArrayEqualityComparer : IEqualityComparer<byte[]> 
    { 
     public bool Equals(byte[] x, byte[] y) 
     { 
      return x.SequenceEqual(y); 
     } 

     public int GetHashCode(byte[] obj) 
     { 
      return obj.GetHashCode(); 
     } 
    } 
} 

출력 :

GetHashCodeDistinct에 의해 사용되며, "있는 그대로"작동하지 않습니다
2 

답변

4

;

int result = 13 * obj.Length; 
for(int i = 0 ; i < obj.Length ; i++) { 
    result = (17 * result) + obj[i]; 
} 
return result; 

해시 코드에 필요한 동등 조건을 제공해야합니다.

개인적으로, 나는 또한 성능을 위해 평등 테스트를 풀다 것 :

if(ReferenceEquals(x,y)) return true; 
if(x == null || y == null) return false; 
if(x.Length != y.Length) return false; 
for(int i = 0 ; i < x.Length; i++) { 
    if(x[i] != y[i]) return false; 
} 
return true; 
+0

감사합니다, 그것을 작동합니다. 어레이의 내용에 Array.GetHashCode()가 의존하지 않는 것 같습니다 (앱을 실행할 때마다 결과가 달라집니다). – GameZelda

+0

@GameZelda - 참으로; 배열은 자신 만의 비교자를 제공 할 때까지 간단하게 참조 동등성을 사용합니다. –

관련 문제