Использование запроса Linq внутри списка.AddRange для условного добавления элементов из одного списка в другой

у меня есть List<String> и два List<CustomObject>.
Я хочу объединить два List<CustomObject> но только если второй List<CustomObject> свойство не содержится в List<String>.

Итак, хотите сделать что-то вроде этого:

resultSet1.AddRange(resultSet2.Select(x => !names.Contains(x.City)).ToList());

что я пропустила?

1 ответов


вы растратите Select когда вы должны использовать Where.

resultSet1.AddRange(resultSet2.Where(x => !names.Contains(x.City));

Select метод проекции. Он берет последовательность и выбирает ее, иногда выбирая весь элемент, одно свойство или проецируя его на что-то совершенно другое.

Where - Это метод фильтрации. Он принимает последовательность и применяет к ней предикат, давая только элементы, которые передают предикат.

(в вашем примере, с помощью Select, ты эффективно пытается добавить список bool в список CustomObject, который не будет работать.)


не обращаясь к конкретной ошибке под рукой, вот некоторые дополнительные идеи для рассмотрения.

это ситуация, когда HashSet<string> может быть полезным для names, особенно если names значительно большие. Contains на HashSet<T> имеет O(1) сложность, тогда как это O (n) для List<T>. Однако существуют накладные расходы, связанные с HashSet, поэтому, если у вас есть какие-либо проблемы, лучше всего измерить оба и посмотреть, какой из них более эффективен.

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

var sequence = resultSet1.Union(resultSet2.Where(x => !names.Contains(x.City)));
var sequence = resultSet1.Concat(resultSet2.Where(x => !names.Contains(x.City)));

разница в том, что два Union отфильтрует любые дубликаты в результирующей последовательности (с обоих входов, а не только со второго против первого), Concat не применяет логику фильтрации дубликатов и просто передает одну последовательность за другой. Входные последовательности (resultSet1 и resultSet2) не изменяются.