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
.

È stato utile?

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
scroll top