如何使用Linq语句设置属性

时间:2018-06-25 04:20:07

标签: c# linq collections

不是执行此可怕的循环,而是实现了所需的结果:

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 :(得分:1)

将linq更改为ForEach,因为Select不会以您想要的方式遍历collection。 MSDN定义:-

  

Select将序列的每个元素投影为新形式。

     

ForEach对列表的每个元素执行指定的操作。

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

答案 1 :(得分:0)

您在做的错误是:select返回相同的集合,但是直到对象被迭代为止才有效。坐在foreach调用中,选择位于执行路径之外。 (请查看评论以获取更多信息)。

调用中的

.select()本身并没有什么特别之处,但可以确定返回列表的外观。 .select()。ToList()遍历集合,并应用投影。

如果您要设置一个等于.select调用的变量,但从不访问其中的数据,则这些值本质上仍将是它们的起始名称。一旦您遍历或选择一个特定元素,它将立即应用投影。

将选择项更改为每个vasily的注释将为您提供所需的结果。

我是否可以建议您进一步将值设置为等于0(向上或向下)? -在不知道用例的情况下,也许有比您选择的位置更好的默认值将其重置为0?  (自动映射器,初始化器等)

答案 2 :(得分:0)

使用SelectMany遍历嵌套列表的树。最后使用ForEach函数来完成工作:

base::mean()