﻿# V3224\. Consider using an overload with 'IEqualityComparer', as it is present in similar cases for the same collection element type\.

Анализатор указывает на вызов метода или конструктора, в который не передаётся аргумент, реализующий интерфейс IEqualityComparer<T\>\. Возможно, этот аргумент был пропущен по ошибке\. На это указывает наличие других методов или конструкторов, обрабатывающих коллекции с элементами того же типа, в которые передаётся аргумент с типом IEqualityComparer<T\>\.

Рассмотрим пример:

```cpp
class CustomObjectComparer : IEqualityComparer<CustomObject> {}
```



```cpp
static CustomObjectComparer _comparer = new();

HashSet<CustomObject> _hashSet = new(_comparer);
Dictionary<CustomObject, int> _dictionary = new(_comparer);
List<CustomObject> _list = new();

void ExampleFoo(CustomObject obj)
{
    ....
    if (_list.Contains(obj))  // <=
    ....    
}
```

В данном примере при инициализации коллекций `_hashSet` и `_dictionary` используется `_comparer` в качестве аргумента конструктора, который задаёт специфичную логику сравнения элементов этих коллекций\.

Кроме того, в коде есть ещё одна коллекция — `_list`, при инициализации которой `_comparer` не может быть передан, так как в конструкторе нет соответствующего параметра\. 

Однако в методе `ExampleFoo` есть вызов `list.Contains`\. Этот вызов может принимать на вход аргумент, реализующий интерфейс `IEqualityComparer<CustomObject>`, но в данном случае он отсутствует\.

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

Исправленный код в этом случае может выглядеть так:

```cpp
void ExampleFoo(CustomObject obj)
{
    ....
    if (_list.Contains(obj, _comparer))
    ....    
}
```