Конечно, Руфус решил вашу проблему в ответе.Но позвольте мне объяснить, почему ваш подход не работал.
Причина, по которой он приводит к пустому результату, заключается в том, что Equals(string x, string y)
никогда не будет вызван.Это может вывести неравенство из метода GetHashCode
.Если хэши одинаковы, он будет вызывать Equals
.Другими словами, ваша логика в Equals
никогда не будет выполнена.
Вот некоторый код, чтобы вы могли видеть, что происходит.
class Program
{
static void Main(string[] args)
{
// See I added an item at the end here to show when Equals is called
List<string> lst = new List<string> { "abcXdef", "abcXdef", "abcede", "aYcde", "X" };
List<string> num = new List<string> { "X", "Y", "Z" };
var fin = lst.Intersect(num, new MiNumeroEqualityComparer()).ToList();
Console.ReadLine();
}
}
public class MiNumeroEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
Console.WriteLine("Equals called for {0} and {1}.", x, y);
return x.Contains(y);
}
public int GetHashCode(string obj)
{
Console.WriteLine("GetHashCode alled for {0}.", obj);
return obj.GetHashCode();
}
}
Если вы запустите приведенный выше код, он будет вызывать Equals
только для элементов, которые производят такой же хэш;так что только для "X".
См. Вывод в этой скрипке .