Структура размещения в LINQ С#
Мне удалось сделать выбор из сложной структуры объекта, но только с помощью foreach, как я могу избежать этого foreach и решить мою проблему, просто используя LINQ?
var product = new List<ProductCrp>
{
new ProductCrp {
Strucutre = new StructureItem() {
CheckList = new CheckList() {
Checks = new List<Check>
{
new Check { NumberAsInt = "149" },
new Check { NumberAsInt = "260" },
new Check { NumberAsInt = null }
}
}
}
},
new ProductCrp {
Strucutre = new StructureItem() {
CheckList = new CheckList() {
Checks = new List<Check>
{
new Check { NumberAsInt = "261" },
new Check { NumberAsInt = "150" },
new Check { NumberAsInt = "260" }
}
}
}
}
};
string[] numbers = { "149" };
LINQ:
foreach (var item in product)
{
item.Strucutre.CheckList.Checks = item.Strucutre.CheckList.Checks.Where(w => numbers.Contains(w.NumberAsInt)).Select(w => w);
}
Ответы
Ответ 1
Мне удалось сделать выбор из сложной структуры объекта, но только с помощью foreach, как я могу избежать этого foreach и решить свою проблему, просто используя LINQ?
Вы не используете LINQ для этой цели. Вы используете foreach
правильно.
LINQ предназначен для запроса данных. Цикл foreach
заключается в неоднократном создании побочного эффекта. Тело вашего foreach
изменяет свойство объекта; это обновление, а не запрос, поэтому вы делаете это правильно. Использование LINQ для этого неверно; не делай этого.
Ответы, которые говорят, например, использовать ToList
для принудительной итерации запроса с побочным эффектом, являются крайне плохим стилем и приводят к коду, который неэффективен, трудно понять, трудно поддерживать и работать против цели операторов запросов. НИКОГДА не злоупотребляйте LINQ. У нас есть встроенная в язык конструкция, которая означает "выполнить эту операцию один раз для каждого элемента коллекции" и называется foreach
. Используйте его.
Ответ 2
Вы ищете что-то вроде этого?
product.ForEach(item => item.Strucutre.CheckList.Checks = item.Strucutre.CheckList.Checks.Where(w => numbers.Contains(w.NumberAsInt)).Select(w => w).ToList());