2010-07-25 23 views
2

Cette question sera probablement très simple. J'essaie simplement de supprimer les octets [] en double d'une collection.Suppression des octets [] s en double d'une collection

Puisque le comportement par défaut est de comparer des références, j'ai pensé que créer un IEqualityComparer fonctionnerait, mais ce n'est pas le cas.

J'ai essayé d'utiliser un HashSet et un Distinct() de LINQ.

Exemple de code:

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(); 
     } 
    } 
} 

Sortie:

2 

Répondre

4

Le GetHashCode sera utilisé par Distinct, et ne fonctionnera pas "tel quel"; essayer quelque chose comme:

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

qui devrait fournir les conditions d'égalité nécessaires pour les codes de hachage.

Personnellement, je voudrais également déroulez le test d'égalité des performances:

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

Merci, cela fonctionne. Ressemble à Array.GetHashCode() ne dépend pas du contenu du tableau (j'obtiens des résultats différents chaque fois que je lance l'application). – GameZelda

+0

@GameZelda - en effet; les tableaux utilisent simplement l'égalité de référence jusqu'à ce que vous fournissiez votre propre comparateur. –