簡體   English   中英

Linq to Object -Object更新

[英]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屬性為您提供對原始對象的引用,您可以在其中更改值。 但要意識到,匿名類型的值(在這種情況下為idsalary )不會反映對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM