Предположим, что мои объекты находятся в идеальном рабочем состоянии (т. Е. TDD заставляет меня думать, что они работают).
У меня есть список, который я создаю следующим образом (за исключением правильного отступа):
var result = from v in vendors
from p in v.Products
orderby p.Name
select p;
Это работает - я получаю все товары от всех поставщиков.
Теперь у меня есть список условий, созданный пользователем во время выполнения. Давайте применим их:
foreach (Attribute a in requiredAttributes)
{
result = result.Where(p => p.Attributes.Contains(a));
}
Это может быть примитивно, но я думал, что это сработает. Однако после завершения этого цикла foreach при перечислении «результата» он будет содержать все продукты, имеющие атрибут LAST коллекции requiredAttributes в свойстве Attributes (также коллекции).
Для меня это пахнет так, как будто "а" где-то перезаписывается при каждом путешествии по циклу, и применяется только последнее.
Если не считать написания какого-либо метода расширения для IEnumerable, называемого ContainsAll (IEnumerable), или чего-то в этом роде, как я могу достичь того, чего хочу, что по сути является логическим И, давая мне только те продукты, которые имеют ВСЕ обязательные атрибуты?