[英]Linq to Object -Object update
在LINQ to Object
上下文中,我可以更新內存中的對象。
我的意思是我可以創建新的類型
var query =from e in empList
select new {id=e.id,salary=e.salary * (10/100) };
我可以更新一個對象嗎?
沒有; 你需要使用foreach
循環。
匿名類型是不可變的。 如果類型不是匿名的,您可以將集合轉儲到List並修改它:
(from e in empList)
.ToList()
.ForEach(e => {
e.salary = 999;
})
;
注意我在lambda中使用塊語法。
這取決於你的要求。
如果您問: 我可以使用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;
}
這將更新原始項目上的salary屬性,但element.salary
仍將反映在查詢中計算的原始值,而不是新工資值/ 10.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中的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.