簡體   English   中英

將一個集合中的屬性設置為另一個集合

[英]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.

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