Существует ли операция Linq для определения наличия в коллекции элементов, имеющих одинаковые значения для пары свойств?

StackOverflow https://stackoverflow.com/questions/1630277

Вопрос

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())
{
 ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top