У меня есть список
List<MyObject> myList
и я добавляю элементы в список и хочу проверить, есть ли этот объект в списке.
поэтому, прежде чем я это сделаю:
myList.Add(nextObject);
Я хочу увидеть, есть ли nextObject уже в списке.
Объект «MyObject» имеет ряд свойств, но сравнение основано на сопоставлении двух свойств.
Как лучше всего проверить, прежде чем я добавлю новый «MyObject» в этот список «MyObject».
Единственное решение, которое я придумал, заключалось в том, чтобы перейти от списка к словарю, а затем сделать ключ конкатенированной строкой свойств (это кажется немного неэлегантным).
Любые другие более чистые решения, использующие список или LINQ или что-то еще?
Просто используйте метод Contains . Обратите внимание, что он работает на основе функции равенства
Equals
источник
Если эти 2 свойства можно поддерживать, вы можете:
источник
Вы уверены, что вам нужен список в этом случае? Если вы заполняете список большим количеством элементов, производительность снизится из-за
myList.Contains
илиmyList.Any
; время выполнения будет квадратичным. Возможно, вы захотите рассмотреть возможность использования более совершенной структуры данных. Например,Вы можете использовать HashSet следующим образом:
Конечно, если это определение равенства для
MyClass
«универсальное», вам не нужно писатьIEqualityComparer
реализацию; вы можете просто переопределитьGetHashCode
иEquals
в самом классе.источник
Также следует упомянуть, что вы должны убедиться, что ваша функция равенства соответствует вашим ожиданиям. Вы должны переопределить метод equals, чтобы указать, какие свойства вашего объекта должны совпадать, чтобы два экземпляра считались равными.
Тогда вы можете просто сделать mylist.contains (item)
источник
Вот краткое консольное приложение, чтобы показать, как решить вашу проблему.
Наслаждайтесь!
источник
Изменить: я сначала сказал:
Что неэлегантного в словарном решении. Мне это кажется совершенно элегантным, особенно потому, что вам нужно только установить компаратор при создании словаря.
Конечно, использовать что-то в качестве ключа, когда оно также является значением, неэлегантно.
Поэтому я бы использовал HashSet. Если последующие операции потребовали индексации, я бы создал список из него после завершения добавления, в противном случае просто использовал бы хэш-набор.
источник
Просто, но работает
или
источник
Если вы используете ядро EF, добавьте
пример
источник