LINQ - 更新where子句中的字段

时间:2012-03-28 21:59:03

标签: linq

我的对象层次结构如下:

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));

5 个答案:

答案 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;}));