Ни Equals, ни GetHashCode не вызываются на IEqualityComparer - PullRequest
0 голосов
/ 10 мая 2018

Я сравниваю два List<Dictionary<string, object>> с моей собственной реализацией IEqualityComparer<Dictionary<string, object>>, но ни GetHashCode, ни метод Equals не вызываются.

Вот моя собственная реализация IEqualityComparer.

public class TestEqualityComparer : IEqualityComparer<Dictionary<string, object>>
{
    public bool Equals(Dictionary<string, object> a, Dictionary<string, object> b)
    {
        return true; // breakpoint here
    }

    public int GetHashCode(Dictionary<string, object> obj)
    {
        return 0; // breakpoint here
    }
}

А вот реальный код сравнения.

var a = new List<Dictionary<string, object>>();
var b = new List<Dictionary<string, object>>();

a.Add(new Dictionary<string, object> { ["id"] = 1, ["msg"] = "aaaaa" });
a.Add(new Dictionary<string, object> { ["id"] = 2, ["msg"] = "bbbbb" });
a.Add(new Dictionary<string, object> { ["id"] = 3, ["msg"] = "ccccc" });

b.Add(new Dictionary<string, object> { ["id"] = 1, ["msg"] = "zzzzz" });
b.Add(new Dictionary<string, object> { ["id"] = 2, ["msg"] = "bbbbb" });
b.Add(new Dictionary<string, object> { ["id"] = 4, ["msg"] = "ddddd" });

var except = a.Except(b, new TestEqualityComparer());

Когда я запускал приведенный выше код, точки останова никогда не срабатывали. В чем проблема?

1 Ответ

0 голосов
/ 10 мая 2018

Поскольку LINQ использует отложенное выполнение , содержимое except коллекции не будет определено, пока вы не решите выполнить его итерацию, следовательно, нет вызовов к вашему IEqualityComparer.

Для принудительной оценки вашего оператора Except вы можете либо повторить его с помощью foreach, либо добавить ToList/ToArray к вашему утверждению, например, так:

var except = a.Except(b, new TestEqualityComparer()).ToList(); // ToList forces processing of LINQ query
...