Ваш компаратор равенства объявляет два объекта равными, если они возвращают одинаковое значение для GetHashCode (). Конечно, когда вы определяете свой собственный компаратор равенства, вы можете определять концепцию равенства любым способом, если хотите, чтобы ваше равенство было рефлексивным, симметричным и транзитивным (x == x; если x == y, то y == x ; если x == y и y == x, то x == z).
Ваш компаратор равенства соответствует этим правилам, поэтому вы можете его использовать.
Однако! Будет ли это полезным компаратором?
Вы хотите использовать специальный компаратор равенства вместо компаратора по умолчанию, потому что вам нужно специальное определение (не) равенства двух объектов.
Обычно, во время процесса проектирования вы должны сначала определить равенство ваших объектов. Если вы сделали это и хотите использовать LambdaBasedComparer, вам нужно создать хеш-функцию, которая будет возвращать разные значения для разных объектов.
Обычно хеш-функции имеют одно требование: два равных объекта должны возвращать одно и то же хеш-значение. Для двух разных объектов требования отсутствуют.
Существуют только различные значения Hash Int32.MaxValue, поэтому, если вы разработали класс с более чем этим значением, возможны неравные экземпляры, и вы не сможете использовать свой компаратор. Простой пример: попробуйте создать LambdaBasedComparer<long>
, который использует нормальное равенство.
Но даже если ваш класс может создавать только половину экземпляров Int32.MaxValue, будет очень трудно создать правильную хеш-функцию, которая будет генерировать уникальные значения хеш-функции для различных объектов.
Наконец, ваше равенство не будет очень интуитивным, если вы используете его для сравнения производных классов. Рассмотрим класс Person и производные классы Employee и Customer.
IEqualityComparer<Person> personComparer = new LambdBasedComparer<Person>(...);
Person p = new Person(...);
Person e = new Employee(...);
Person c = new Customer(...);
Теперь я могу сказать, что определенный Человек, который не является Сотрудником, может сравниться с одним из Ваших Сотрудников. Но скажете ли вы, что сотрудники будут равны клиентам?
Подводя итог: вы думаете, что у вас есть простое решение для ваших компараторов, но будет очень трудно создать правильную хеш-функцию для вашего определения равенства, и, вероятно, будет еще сложнее протестировать эту хеш-функцию