Как установить свойства с помощью оператора Linq - PullRequest
0 голосов
/ 25 июня 2018

Вместо выполнения этого ужасного цикла, который приводит к желаемому результату:

foreach (var mealsViewModel in mealsListCollection)
            {
                foreach (var VARIABLE in mealsViewModel.Items)
                {
                    foreach (var d in VARIABLE.ArticlesAvailable)
                    {
                        d.ArticleQty = 0;

                    }

                }
            }

Я пытаюсь достичь того же результата, но с помощью этого оператора linQ:

mealsListCollection.ForEach(u =>
                u.Items.Select(o => o.ArticlesAvailable.Select(c =>
                {
                    c.ArticleQty = 0;
                    return c;
                })));

Нооператор linQ не сбрасывает ArticleQty в ноль

Что я делаю не так?и почему ?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

То, что вы делаете неправильно: select возвращает вашу коллекцию, но не действует, пока объекты не будут повторены.Находясь в вызове foreach, селекторы находятся за пределами пути выполнения.(Для получения дополнительной информации просмотрите комментарии).

.select () в вызове не делает ничего особенного, кроме определения того, как будет выглядеть возвращаемый список..select (). ToList () выполняет итерацию по коллекции, применяя проекцию.

Если вы установите переменную, равную вызову .select, но никогда не получите доступ к данным внутри нее, тогда значения по существу будутвсе еще быть тем, с чего они начали.Как только вы перебираете или выбираете определенный элемент, он затем применяет проекции.

Изменение выбора на foreachs для комментариев Василия даст вам желаемые результаты.

Могу ли я, возможно,предложить, чтобы вы смотрели, чтобы установить значение равным 0 дальше вверх по вашему стеку (или вниз)?- Не зная вашего варианта использования, может быть, есть ли лучшее место, чтобы вернуть его по умолчанию к 0, чем там, где вы выбрали?(автомат, инициализатор и т. д.)

0 голосов
/ 25 июня 2018

Используйте SelectMany для работы с деревьями вложенных списков. Используйте функцию ForEach последней для выполнения работы:

mealsListCollection
.SelectMany(m => m.Items)
.SelectMany(i => i.ArticlesAvailable)
.ToList()
.ForEach(a => { a.ArticleQty = 0; });
0 голосов
/ 25 июня 2018

Измените свой linq на ForEach, потому что Select не выполняет итерацию по collection так, как вы хотите. Определение MSDN: -

Select Проецирует каждый элемент последовательности в новую форму.

ForEach Выполняет указанное действие для каждого элемента списка.

mealsListCollection.ForEach(u => 
     u.Items.ForEach(o => 
     o.ArticlesAvailable.ForEach(c =>
     {
         c.ArticleQty = 0;
     })));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...