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

2

С#: У меня есть набор объектов. T имеет 2 свойства. Свойство A и свойство B. Правило, которое должен соблюдать этот сборник, состоит в том, что комбинация значений для A и B должна быть уникальной в коллекции. Другими словами, A и B должны использоваться в качестве составного первичного ключа.

Есть ли операция Linq, которую я могу использовать для проверки этого условия? Я ожидаю, что это будет что-то вроде

if (items.Select(x => x.Name).Distinct().Count() != items.Select(x => x.Name).Count())

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

Теги:
linq
composite-key
anonymous-types

3 ответа

12
Лучший ответ

Используйте анонимный тип для выбора составного ключа, например

int totalCount = items.Count();
int distinctCount = items.Select(x => new { x.Name, x.Other })
                         .Distinct()
                         .Count();

Анонимные типы автоматически реализуют равенства и хэш-коды на основе их свойств (и сравнительного сравнения по умолчанию для типов этих свойств).

0

Вы можете ввести собственный сопоставитель сравнений. Пример здесь: http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/c5b71644-b2d9-422b-b7fe-ef3bef30bbac/

  • 1
    Будьте осторожны здесь. Пользовательские компараторы подходят для LINQ для объектов, но выдают исключение времени выполнения в LINQ to SQL или Entity Framework.
0

Просто выберите новый анонимный объект

var keys = items.Select( x => new { x.Name, x.Other } ).ToList();

if (keys.Distinct().Count() != keys.Count())
{
 ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню