Создание LINQ запрашивает программно без локальных переменных, обманывающих меня

Это не имеет ничего общего с атрибутивным механизмом. Вы просто получаете разные объекты из вызова legend() каждый раз. Эти объекты имеют разные атрибуты, поэтому использование одного возвращаемого значения legend() не влияет автоматически на другое.

12
задан Cœur 11 October 2017 в 03:14
поделиться

3 ответа

(Отредактированный для ясности.)

Проблемой является цикл foreach и то, что "a" переменная получается и затем изменилась каждый раз. Вот модификация, которая будет работать путем эффективного представления "новой" переменной для каждого повторения цикла и получения что новая переменная.

foreach (Attribute a in requiredAttributes)
{
    Attribute copy = a;
    result = result.Where(p => p.Attributes.Contains(copy));
}

Решением Omer является более чистое, если можно использовать его, но это может помочь, если реальный код на самом деле более сложен :)

Править: Существует больше о проблеме в этой статье закрытий - прокручивают вниз к "Сравнению стратегий получения: сложность по сравнению с питанием".

19
ответ дан 2 December 2019 в 04:54
поделиться
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.

7
ответ дан 2 December 2019 в 04:54
поделиться

Я не кодировал его, но изменение

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));
}

должен зафиксировать его также, я думаю.

5
ответ дан 2 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: