我的对象层次结构如下:
class Detail
{
public List<Row> Rows { get; set; }
}
class Row
{
public List<Column> Columns { get; set; }
}
class Column
{
public string Name { get; set; }
public bool IsUpdated { get; set; }
}
我想设置column.IsUpdated = true其中column.Name =“id”。 我正在尝试这个,它不起作用。
detail.Rows.ForEach(r => r.Columns.Where(c => c.Name.ToLower().Equals("id")).ToList<Column>().Select(c => c.IsUpdated = true));
答案 0 :(得分:7)
LINQ的哲学是没有副作用。这就是为什么故意让你不容易做到这一点。你可以用经典的
来做到这一点var cols = details.Rows.SelectMany(r => r.Columns)
.Where(c => c.Name.ToLower().Equals("id"));
foreach(var col in cols) {
col.IsUpdated = true;
}
或使用List.ForEach
,但方式不同:
details.Rows.SelectMany(r => r.Columns)
.Where(c => c.Name.ToLower().Equals("id")).ToList()
.ForEach(c => { c.IsUpdated = true });
答案 1 :(得分:1)
LINQ主要用于查询数据,而不是更改数据中的值。如果你想制作一个全新的细节项目,你可以这样做:
var newDetail = new Detail
{
Rows = detail.Rows.Select(r => new Row
{
Columns = r.Columns.Select(c => new Column { Name = c.Name, IsUpdated = c.Name.ToLower() == "id" ? true : c.IsUpdated }).ToList()
})
.ToList()
};
请注意,如果为类型添加了构造函数,上面的内容会更清晰。
话虽如此,如果您想要更新它,就像您正在展示的那样,我只会使用循环:
foreach(var row in detail.Rows)
foreach(var col in row.Columns)
if (col.Name.ToLower() == "id")
col.IsUpdated = true;
我发现更容易理解,特别是在这种情况下。
答案 2 :(得分:0)
您不应该使用LINQ改变集合的所有元素(尽管可以这样做,请参阅this question)。使用香草foreach
时,它更简单,更易读。
foreach (var row in detail.Rows)
foreach (var col in row.Columns)
if (c.Name.ToLower().Equals("id"))
c.IsUpdated = true;
答案 3 :(得分:0)
我让它像这样工作。它效率低下吗?而不是。选择我放.Any。它有效,但我不确定它是否对大数据效率低下。如果是,我可以使用其中一个答案。
detail.Rows.ForEach(r => r.Columns.Where(c => c.Name.ToLower().Equals("id")).ToList<Column>().Any(c => c.IsUpdated = true));
答案 4 :(得分:0)
试一试。现在应该使用您尝试使用的相同概念更新“IsUpdated”。
detail.Rows.ForEach(r => r.Columns.Where(c => c.Name.ToLower().Equals("id")).ToList<Column>().Select(c => {c.IsUpdated = true; return c;}));