Linq to Object -Object更新

时间:2010-04-01 14:38:35

标签: c# linq

LINQ to Object上下文中,我可以更新内存中的对象吗。

我的意思是我可以创建像

这样的新类型
var query =from e in empList
           select new {id=e.id,salary=e.salary * (10/100) };

我可以更新一个对象吗?

4 个答案:

答案 0 :(得分:4)

没有;你需要使用foreach循环。

答案 1 :(得分:4)

匿名类型是不可变的。如果类型不是匿名的,您可以将集合转储到List并修改:

(from e in empList)
.ToList()
.ForEach(e => {
    e.salary = 999;
})
;

注意我在lambda中使用了块语法。

答案 2 :(得分:4)

这取决于你的要求。

如果你问:我可以使用LINQ语句更新集合元素的数据吗?那么答案就是否定的; LINQ是一种查询语言,而不是数据修改语言。只需在原始集合上使用foreach循环,就像在.NET 3.5 / C#3.0之前一样。这里没什么可看的。

如果你问我可以在我的问题中更新我在查询中创建的类型的值吗?,那么答案就是“sortof”。您使用new { ... }创建的类型是匿名类型,这使其不可变(只读)。没有干净的方法可以做你想要的事情,但是你可以做点什么:

var query = from e in empList
            select new { id = e.id, salary = e.salary / 10.0, record = e }

执行此操作将通过record属性为您提供对原始对象的引用,您可以在其中更改值。但要意识到,匿名类型(在这种情况下为idsalary)上的值不会反映record中对引用对象所做的任何更改。

foreach(var element in empList)
{
    element.record.salary = 100.0;
}

这将更新原始项目的工资属性,但element.salary仍将反映查询中计算的原始值,新工资值/ 10.0

答案 3 :(得分:0)

当然,这样可以正常工作。

但请注意,您创建的对象虽然看起来与Emp具有相同的属性,但它们将是一种独特的对象类型。

详细说明,如果你要说:

var query =from e in empList 
select e;

您正在创建Emp对象的集合。当你说:

var query =from e in empList    
select new {id=e.id,salary=e.salary * (10/100) };

您正在创建一个与Emp对象具有相同形式的自治对象的集合。您可以在创建它时分配可能与原始empList值不同的值,但是一旦该语句完成,则无法再次更改这些值。这里没有任何内容会影响empList中的值。