Удаление дубликата байта [] S из коллекции
-
29-09-2020 - |
Вопрос
Это, вероятно, будет чрезвычайно простым вопросом.Я просто пытаюсь удалить дубликат байта [] S из коллекции.
Поскольку поведение по умолчанию должно сравнить ссылки, я завел, что создание iequalityComparer будет работать, но это не так.
Я пытался использовать отчетливый ().
Образец кода:
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();
}
}
}
.
Выход:
2
. Решение
Генеракодицетагкод будет использоваться генеракодицетагкодом, а не будет работать «как есть»;попробуйте что-то вроде:
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;
. Не связан с StackOverflow