Структура размещения в 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());