Это не имеет ничего общего с атрибутивным механизмом. Вы просто получаете разные объекты из вызова legend()
каждый раз. Эти объекты имеют разные атрибуты, поэтому использование одного возвращаемого значения legend()
не влияет автоматически на другое.
(Отредактированный для ясности.)
Проблемой является цикл foreach и то, что "a" переменная получается и затем изменилась каждый раз. Вот модификация, которая будет работать путем эффективного представления "новой" переменной для каждого повторения цикла и получения что новая переменная.
foreach (Attribute a in requiredAttributes)
{
Attribute copy = a;
result = result.Where(p => p.Attributes.Contains(copy));
}
Решением Omer является более чистое, если можно использовать его, но это может помочь, если реальный код на самом деле более сложен :)
Править: Существует больше о проблеме в этой статье закрытий - прокручивают вниз к "Сравнению стратегий получения: сложность по сравнению с питанием".
var result = from v in vendors
from p in v.Products
where requiredAttributes.All(a => p.Attributes.Contains(a))
orderby p.Name
select p;
HTH.
Я не кодировал его, но изменение
foreach (Attribute a in requiredAttributes){
result = result.Where(p => p.Attributes.Contains(a));
}
кому:
foreach (Attribute a in requiredAttributes){
Attribute b = a;
result = result.Where(p => p.Attributes.Contains(b));
}
должен зафиксировать его также, я думаю.