Хотя приведенные выше ответы правильные , они представляют собой ответы "дай человеку рыбу". Было бы лучше воспользоваться этой возможностью, чтобы узнать, как разбить проблему на маленькие части, а затем собрать результаты в запросы.
В вышесказанном, что мне нужно / хочу сделать
включить SavedOption, только если
вызов OptionTextDoesMatch AND SomeID
сохраненного варианта находится в
список SomeID в itemOptions.
Позвольте мне попытаться перефразировать это чье-то запутанное предложение.
У вас есть список SavedOptions. Каждый SavedOption имеет идентификатор и текст.
У вас есть список опций. Каждый параметр имеет идентификатор и текст.
Вы хотите отфильтровать список SavedOptions, чтобы получить SavedOptions, которые соответствуют некоторому Option для ОБА и текста и идентификатора.
Устранить проблему. Предположим, у вас не было последовательности SavedOptions. Предположим, у вас только один вариант SavedOption и список опций. Как бы вы сказали, если это был матч?
Это просто:
SavedOption mySavedOption = whatever;
bool matchExists = itemOptions.Any(item=>
OptionTextDoesMatch(item, mySavedOption) &&
item.SomeID == mySavedOption.SomeID);
Имеет ли это смысл?
Теперь предположим, что вы хотите сделать предикат из того, что требует SavedOption. Как бы вы это сделали? Это просто:
Func<SavedOption, bool> predicate = savedOption =>
itemOptions.Any(item=>
OptionTextDoesMatch(item, savedOption ) &&
item.SomeID == savedOption.SomeID);
Это предикат , который определяет, соответствует ли элемент одного .
Все еще имеет смысл? Остановите меня, если что-то смущает.
Чтобы сделать из него фильтр, примените предикат к каждому элементу в списке сохраненных опций :
result = savedOptions.Where(savedOption =>
itemOptions.Any(item=>
OptionTextDoesMatch(item, savedOption) &&
item.SomeID == savedOption.SomeID));
Или в форме для понимания запросов, которую мне лично легче читать.
result = from savedOption in savedOptions
where itemOptions.Any(item =>
OptionTextDoesMatch(item, savedOption) &&
item.SomeID == savedOption.SomeID)
select savedOption;
Но, возможно, лучший выбор - использовать соединение. Объединение - это просто оптимизация фильтра декартовых произведений двух коллекций, связанных идентификатором.
result = from savedOption in savedOptions
join itemOption in itemOptions
on savedOption.SomeID equals itemOption.SomeID
where OptionTextDoesMatch(itemOption, savedOption)
select savedOption;
Это ясно?