Hasta hoy, entendí que un HashSet usa GetHashCode dentro de Contains . Eso también se dice por ejemplo aquí .
Escribí un pequeño IEqualityComparer :
public class MyComparer : IEqualityComparer<string> { public bool Equals(string? a, string? b) { return a == b; } public int GetHashCode(string a) { throw new NotImplementedException(); } }Y lo usé así:
public void TestMyComparer() { var x = new HashSet<string>(new []{ "hello", "world" }); bool helloInside = x.Contains("hello", new MyComparer()); } Pero TestMyComparer no arroja una NotImplementedException , como esperaba. En su lugar, devuelve true .
¿Por qué?
Si usa HashSet.Contains , pase su comparador personalizado al constructor .
var x = new HashSet<string>(new MyComparer()); x.Add("hello"); x.Add("world"); bool helloInside = x.Contains("hello"); Ahora se usa GetHashCode ya que usa una colección basada en conjuntos y no Enumerable.Contains . Contiene que solo enumera todos los elementos y los compara con Equals .