C#使用linq給List某個屬性值賦值方式

在 C# 中,LINQ 的設(shè)計初衷是用于查詢數(shù)據(jù)而非修改數(shù)據(jù)(即“無副作用”)。因此,直接使用 LINQ 的 Select 或 Where 來賦值并不是最佳實(shí)踐,且容易引發(fā)混淆。
不過,根據(jù)具體場景,有以下幾種常見方式可以實(shí)現(xiàn)“給 List 中對象的某個屬性賦值”:
1. 使用ForEach方法(推薦,簡潔直觀)
這是最常用且易讀的方式。List<T> 提供了 ForEach 擴(kuò)展方法,可以直接遍歷并修改每個元素的屬性。
// 假設(shè)有一個 Person 類,包含 Name 和 Age 屬性 list.ForEach(p => p.Age = 30); // 將所有人員的年齡設(shè)置為 30 // 條件賦值:只修改滿足條件的元素 list.Where(p => p.Name == "Alice").ToList().ForEach(p => p.Age = 25);
注意:
Where返回的是IEnumerable,沒有ForEach方法,所以需要調(diào)用.ToList()轉(zhuǎn)換為列表后再執(zhí)行ForEach。- 但這會創(chuàng)建一個新的臨時列表,如果數(shù)據(jù)量極大,性能略遜于傳統(tǒng)
foreach循環(huán)。
2. 使用傳統(tǒng)foreach循環(huán)(性能最佳,標(biāo)準(zhǔn)做法)
對于需要修改集合元素屬性的場景,傳統(tǒng)的 foreach 循環(huán)是微軟官方推薦的方式,因?yàn)樗逦?、高效且不?chuàng)建額外開銷。
foreach (var item in list)
{
if (item.Name == "Bob")
{
item.Age = 40;
}
}3. 使用 LINQSelect投影生成新列表(不可變風(fēng)格)
如果你希望保持原列表不變,而是生成一個具有新屬性值的新列表,可以使用 Select。這實(shí)際上不是“賦值”,而是“轉(zhuǎn)換”。
var newList = list.Select(p => new Person
{
Name = p.Name,
Age = p.Name == "Charlie" ? 50 : p.Age // 條件賦值
}).ToList();適用場景:
函數(shù)式編程風(fēng)格,或需要保留原始數(shù)據(jù)快照時。
4. 兩個 List 關(guān)聯(lián)賦值(參考搜索結(jié)果中的場景)
如果需要根據(jù)另一個 List 的值來更新當(dāng)前 List 的屬性(例如根據(jù) ID 匹配更新名稱),可以結(jié)合 Join 或 FirstOrDefault。
方法一:使用 ForEach + FirstOrDefault
listA.ForEach(a =>
{
var match = listB.FirstOrDefault(b => b.Id == a.Id);
if (match != null)
{
a.Name = match.Name; // 將 listB 的 Name 賦給 listA
}
});方法二:使用 Join 投影(生成新列表)
var updatedList = (from a in listA
join b in listB on a.Id equals b.Id into joined
from b in joined.DefaultIfEmpty()
select new PersonA
{
Id = a.Id,
Name = b != null ? b.Name : a.Name
}).ToList();總結(jié)建議
- 直接修改原列表:優(yōu)先使用
foreach循環(huán)或List.ForEach。 - 條件批量修改:
list.Where(...).ToList().ForEach(...)寫法簡潔,但注意性能。 - 生成新列表:使用
Select進(jìn)行投影。 - 避免:不要嘗試在 LINQ 查詢表達(dá)式(如
from...select)中直接執(zhí)行賦值操作(如x.Prop = value),這違反了 LINQ 的查詢語義,可能導(dǎo)致不可預(yù)知的行為或編譯器警告。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#獲取ListView鼠標(biāo)下的Item實(shí)例
下面小編就為大家?guī)硪黄狢#獲取ListView鼠標(biāo)下的Item實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
C#中使用快速排序按文件創(chuàng)建時間將文件排序的源碼
C#中使用快速排序按文件創(chuàng)建時間將文件排序的源碼...2007-03-03
Unity中的InitializeOnLoad特性實(shí)踐深入解析
這篇文章主要為大家介紹了Unity中的InitializeOnLoad特性實(shí)踐深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
詳細(xì)介紹C#之文件校驗(yàn)工具的開發(fā)及問題
目前校驗(yàn)文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段時間微軟發(fā)布了VisualStudio正式版,win鏡像,微軟官方給出的校驗(yàn)方式都是校驗(yàn)文件的SHA值。下面詳細(xì)介紹C#之文件校驗(yàn)工具的開發(fā)及問題,需要的朋友可以參考下2015-07-07
C#判斷指定驅(qū)動器是否已經(jīng)準(zhǔn)備就緒的方法
這篇文章主要介紹了C#判斷指定驅(qū)動器是否已經(jīng)準(zhǔn)備就緒的方法,涉及C#針對硬件IO操作的技巧,需要的朋友可以參考下2015-04-04

