Création d'un hashCode avec deux paramètres
Bonjour,
J'ai une class avec deux propriétés "clés" A(long?) et B (string) et d'autres propriétés
Pour faire des comparaisons avec des list j'utilise IEqualityComparer
La comparaison se fait sur A et B. Si au moins un des éléments A ou B est identique alors l'objet est identique.
Or mon problème vient du HashCode. Il faut lorsque A et B même différent retourne le même hash, pour être comparer. Avez-vous une idée ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
var objA = new Toto { A = 45, B = "X" };
var objB = new Toto { A = 4, B = "D" };
var objC = new Toto { A = 5, B = "X" };
var objD = new Toto { A = 45, B = "A" };
WriteToto(objA);
WriteToto(objB);
WriteToto(objC);
WriteToto(objD);
//Ne doit retourner que des TRUE
Console.WriteLine(objA.GetHashCode() == objB.GetHashCode());
Console.WriteLine(objA.GetHashCode() != objC.GetHashCode());
Console.WriteLine(objA.GetHashCode() == objC.GetHashCode());
Console.WriteLine(objA.GetHashCode() == objD.GetHashCode());
var listA = new List<Toto>();
var listB = new List<Toto>();
listA.Add(objA);
listA.Add(objB);
listA.Add(objC);
listA.Add(objD);
listB.Add(objA);
var list = listA.Intersect(listB, new TotoComparer()).ToList();
//Normalement je devrai récuperer A, C, D
Console.WriteLine(list.Count == 3);
Console.WriteLine(list.Contains(objA));
Console.WriteLine(list.Contains(objC));
Console.WriteLine(list.Contains(objD));
list = listA.Except(listB, new TotoComparer()).ToList();
//Normalement je devrai récuperer B
Console.WriteLine(list.Count == 1);
Console.WriteLine(list.Contains(objB));
Console.ReadLine();
}
public static void WriteToto(Toto t)
{
Console.WriteLine(t.ToString() + " " + t.GetHashCode());
}
}
public class Toto
{
public long? A { get; set; }
public string B { get; set; }
public string C { get; set; }
public override string ToString()
{
return base.ToString();
}
public override int GetHashCode()
{
//hash code à faire
return A.GetHashCode();
}
}
public class TotoComparer : IEqualityComparer<Toto>
{
public bool Equals(Toto x, Toto y)
{
return
(
(x.A.HasValue) && (x.A == y.A)
||
(x.B == y.B)
)
;
}
public int GetHashCode(Toto obj)
{
return obj.GetHashCode();
}
}
} |
Merci beaucoup de votre aide