您有一个对象列表,每个对象分别有另一个列表项。我想在检查条件后更新子列表中的属性。我尝试过linq查询,但它没有更新属性。请帮帮我
int priceBookId = 1;
foreach (var store in stores)
{
store.SelectedBooks.Where(d => d.BookID == priceBookId ).Select(x => {x.IsPriceBook = true; return x; });
}
每个商店都选择了图书清单,每本图书都有自己的属性。这里我想要的是当所选书籍是价格手册时更新IsPriceBook属性
答案 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方法)中更新对象是个坏主意:
原始代码问题 - Where
和Select
被懒惰地评估,因此没有请求枚举结果,实际上没有评估。要修复 - 强制迭代会起作用。使用.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;
}