Использование запроса 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
) не изменяются.