更新包含在列表

时间:2018-01-29 06:34:44

标签: c# asp.net linq

您有一个对象列表,每个对象分别有另一个列表项。我想在检查条件后更新子列表中的属性。我尝试过linq查询,但它没有更新属性。请帮帮我

int priceBookId = 1;
foreach (var store in stores)
{
    store.SelectedBooks.Where(d => d.BookID == priceBookId ).Select(x => {x.IsPriceBook = true; return x; });
}

每个商店都选择了图书清单,每本图书都有自己的属性。这里我想要的是当所选书籍是价格手册时更新IsPriceBook属性

3 个答案:

答案 0 :(得分:0)

select将创建具有更新属性的新对象,因此如果您这样做:

var updatedProperties = store.SelectedBooks.Where(d => d.BookID == priceBookId ).Select(x => {x.IsPriceBook = true; return x; });

您将在updatedProperties变量中获得结果。在你的情况下。如果使用2个周期,则可以更新属性,如下所示:

foreach (var store in stores)
{
    foreach (var selectedBook in store.SelectedBooks.Where(d => d.BookID == priceBookId))
    {
        selectedBook.IsPriceBook = true;
    }
}

因为store.SelectedBooks有引用类型,所以选择Book.IsPriceBook = true;将通过引用更新值。

答案 1 :(得分:0)

Select()不起作用,因为它创建的投影在您.ToList()之前不会执行任何操作(然后它将执行更新)。但是,这只是以Select的方式使用{<1}}。

您可以尝试ForEach,它会循环显示原始列表,如下所示:

int priceBookId = 1;
foreach (var store in stores)
{
    store.SelectedBooks.Where(d => d.BookID == priceBookId).ToList().ForEach(x => x.IsPriceBook = true);
}

这是最快的解决方案。

答案 2 :(得分:0)

帖子中的代码演示了为什么在.Select(或其他LINQ方法)中更新对象是个坏主意:

  • 没有人预料到修改会发生,不要指望结果会持续存在或者这两种变化
  • LINQ查询的延迟/延迟执行使得很难看到发生了什么。在调试和查看结果时代码可以正常工作,然后在自己运行时失败。

原始代码问题 - WhereSelect被懒惰地评估,因此没有请求枚举结果,实际上没有评估。要修复 - 强制迭代会起作用。使用.ToList().All(...),如Query and updating a property in a collection using LINQ

所示
foreach (var store in stores)
{
  store.SelectedBooks
   .Where(d => d.BookID == priceBookId )
   .Select(x => {x.IsPriceBook = true; return 42; }) // return anything
   .ToList(); // force iteration with `ToList`
}

您甚至可以移除外部foreach

stores.SelectMany(r =>r.SelectedBooks)
   .Where(d => d.BookID == priceBookId )
   .All(x => {x.IsPriceBook = true; return true; }); // force iteration with All

确实以这种方式修复代码将被视为&#34; hack&#34;实际上你应该首先选择项目并对其采取行动:

foreach (var book in 
     stores.SelectMany(store => store.SelectedBooks)
          .Where(d => d.BookID == priceBookId ))
{
  book.IsPriceBook = true;
}