Существует ли операция Linq для определения наличия в коллекции элементов, имеющих одинаковые значения для пары свойств?
-
06-07-2019 - |
Вопрос
C #: у меня есть коллекция объектов. Т имеет 2 свойства. Свойство A и свойство B. Правило, которого должна придерживаться эта коллекция, состоит в том, что комбинация значений для A и B должна быть уникальной в пределах коллекции. Другими словами, A и B должны служить составным первичным ключом.
Есть ли в Linq операция, которую я могу использовать для проверки этого условия? Я ожидаю, что это будет что-то вроде
if (items.Select(x => x.Name).Distinct().Count() != items.Select(x => x.Name).Count())
Вышеприведенное утверждение показывает, как я могу проверить, есть ли в коллекции элементы с одинаковыми именами, но я не знаю, как это сделать для нескольких свойств.
Решение
Используйте анонимный тип для выбора составного ключа, например
int totalCount = items.Count();
int distinctCount = items.Select(x => new { x.Name, x.Other })
.Distinct()
.Count();
Анонимные типы автоматически реализуют равенство и хэш-коды на основе их свойств (и средства сравнения по умолчанию для типов этих свойств).
Другие советы
Вы можете добавить свой собственный компаратор равенства. Пример здесь: http: // social .msdn.microsoft.com / форум / EN-US / linqprojectgeneral / резьба / c5b71644-b2d9-422b-b7fe-ef3bef30bbac /
Просто выберите новый анонимный объект
var keys = items.Select( x => new { x.Name, x.Other } ).ToList();
if (keys.Distinct().Count() != keys.Count())
{
...
}