Rimozione di duplicati byte [] s da una collezione
-
29-09-2020 - |
Domanda
Questa sarà probabilmente una domanda estremamente semplice.Sto semplicemente cercando di rimuovere duplicati byte [] s da una collezione.
Poiché il comportamento predefinito è quello di confrontare i riferimenti, ho pensato che la creazione di un IequityComparer funzionerebbe, ma non lo fa.
Ho provato a utilizzare un HasHSet e Linq's Distinct ().
Codice campione:
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();
}
}
}
.
Uscita:
2
. Soluzione
Il GetHashCode
verrà utilizzato da Distinct
e non funzionerà "così come è";Prova qualcosa come:
int result = 13 * obj.Length;
for(int i = 0 ; i < obj.Length ; i++) {
result = (17 * result) + obj[i];
}
return result;
.
che dovrebbe fornire le necessarie condizioni di uguaglianza per i codici hash.
personalmente , srotolare anche il test di uguaglianza per le prestazioni:
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;
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow