Сравнение GroupBy и IEqualityComparer <TKey>

Я прошел через метод GroupBy в LINQ:

public static IEnumerable<igrouping<tkey, tsource="">> GroupBy<tsource, tkey="">(
 this IEnumerable<tsource> source,
 Func<tsource, tkey=""> keySelector,
 IEqualityComparer<tkey> comparer
)
</tkey></tsource,></tsource></tsource,></igrouping<tkey,>

Я понимаю, как использовать GroupBy и что он возвращает. Я хочу понять значение IEqualityComparer<tkey> comparer</tkey> и что он фактически используется в GroupBy.

2 ответа

Объект IEqualityComparer будет использоваться для выполнения двухэтапной проверки, чтобы убедиться, что экземпляр TKey "равен" ключу существующей группы и, следовательно, должен находиться в этой группе:

  • Он проверяет хэш-код элемента (используя GetHashCode) на хэш-код существующих ключей. Если он не равен ни одному из этих значений, он добавляется в новую группу.
  • Если найден соответствующий хэш-код, он проверяет равенство (используя Equals). Если элемент "равен" групповому ключу, элемент добавляется в эту группу.

Если вы не поставляете компаратор (либо передавая null, либо используя одну из перегрузок, у которой нет этого параметра), используется компаратор "deafult", который использует сам класс TKey, если он реализует IEquatable или любые применимые переопределения Equals и GetHashCode.

Таким образом, это подразумевает несколько ключевых отношений между Equals и GetHashCode:

  • Если два элемента равны, они должны иметь одинаковый хэш-код.
  • Противоположность неверна - два элемента, имеющие один и тот же хэш-код, не должны быть равны.


Вы предоставили бессмысленный аналог равенства, поэтому ваши результаты будут бессмысленными. Ваш хэш-код основан на ссылке на сам сравнитель, который не имеет ничего общего с вашим методом Equals, а в вашем методе Equals вы говорите, что два объекта равны, если первый объект так же длинный или дольше, чем вторая строка. Это просто не имеет смысла, оно даже нарушает основные свойства равенства в том, что порядок параметров должен быть неактуальным.

licensed under cc by-sa 3.0 with attribution.