在LINQ to Object
上下文中,我可以更新内存中的对象吗。
我的意思是我可以创建像
这样的新类型var query =from e in empList
select new {id=e.id,salary=e.salary * (10/100) };
我可以更新一个对象吗?
答案 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
属性为您提供对原始对象的引用,您可以在其中更改值。但要意识到,匿名类型(在这种情况下为id
和salary
)上的值不会反映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中的值。