[英]Setting a property from one collection to another collection
我有兩個聚會
List<Application> myApps;
List<Application> yourApps;
這些列表具有重疊的重疊數據,但是它們來自不同的來源,並且每個來源都有一些缺失的字段數據。
應用程序對象具有稱為描述的屬性
這兩個集合都有一個稱為Key的唯一字段
我想看看是否有LINQ解決方案:
循環瀏覽myApps中的所有應用程序,然后查看密鑰,並查看yourApps中是否存在該密鑰 。 如果是這樣,我想利用在yourApps該應用程序的說明財產和安裝MyApps應用的描述屬性設置為相同的值
我想看看是否有使用lambda表達式的巧妙方法(而不是必須具有循環和許多if語句。)
您可以使用聯接:
foreach(var pair in from m in myApps
join y in yourApps on m.Key equals y.Key
select new { m, y }) {
pair.m.Description = pair.y.Description;
}
var matchingApps = from myApp in myApps
join yourApp in yourApps
on myApp.Key equals yourApp.Key
select new { myApp, yourApp };
foreach (var pair in matchingApps)
{
pair.myApp.Description = pair.yourApp.Description;
}
您的問題要求“ lambda酷”,但對於聯接,我發現查詢表達式語法更加清晰。 但是,查詢的lambda版本如下。
Lambda版本:
var matchingApps = myApps.Join(yourApps, myApp => myApp.Key, yourApp => yourApp.Key, (myApp, yourApp) => new { myApp, yourApp });
如果您的Application類中具有Key屬性,並且您將經常進行這些類型的操作,則可能需要考慮使用Dictionary而不是List。 這將允許您通過按鍵快速訪問應用程序。
然后,您可以執行以下操作:
foreach(var app in myApps)
{
Application yourApp;
if (yourApps.TryGetValue(app.Key, out yourApp)
yourApp.Description = app.Value.Description;
}
否則, 聯接可能是您的最佳選擇。
我認為:
foreach (var item in myApps)
{
var desc = yourApps.FirstOrDefault(app => app.Key == item.Key);
if (desc != null)
{
item.description = desc.description;
}
}
那里仍然有一個forloop,所以可能不是您想要的,但仍然是我的2美分...
:)
為什么不簡單(這將創建可枚舉的副本):
myApps.Join(yourApps,
m => m.Key,
y => y.Key,
(m, y) => new { m, y.description })
.ToList()
.ForEach(c => c.m.description = c.description);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.