将属性从一个集合设置为另一个集合

时间:2010-06-07 20:42:08

标签: c# linq lambda

我有两个颜色

List<Application>  myApps;

List<Application> yourApps;

这些列表具有重叠的重叠数据,但它们来自不同的来源,每个来源都有一些缺少的字段数据。

应用对象有一个名为描述

的属性

两个系列都有一个名为

的唯一字段

我想看看是否有LINQ解决方案:

遍历 myApps 中的所有应用,然后查看密钥,看看 yourApps 中是否存在该密钥。如果是,我想在您的应用中从该应用程序中获取 description 属性,并将 myApps 上的应用程序的description属性设置为相同的值

我想看看是否有使用lambda表达式的光滑方式(而不是必须有循环和一些if语句。)

5 个答案:

答案 0 :(得分:2)

您可以使用加入:

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;
}

答案 1 :(得分:1)

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 coolness”,但对于连接,我发现查询表达式语法更清晰。但是,查询的lambda版本如下所示。

Lambda版本:

var matchingApps = myApps.Join(yourApps, myApp => myApp.Key, yourApp => yourApp.Key, (myApp, yourApp) => new { myApp, yourApp });

答案 2 :(得分:0)

如果您的Application类中有Key属性,并且您将经常执行这些类型的操作,您可能需要考虑使用Dictionary而不是List。这样您就可以通过密钥快速访问应用程序。

然后你可以这样做:

foreach(var app in myApps)
{
    Application yourApp;
    if (yourApps.TryGetValue(app.Key, out yourApp)
        yourApp.Description = app.Value.Description;
}

否则,a join可能是您的最佳选择。

答案 3 :(得分:0)

我想:

        foreach (var item in myApps)
        {
            var desc = yourApps.FirstOrDefault(app => app.Key == item.Key);
            if (desc != null)
            {
                item.description = desc.description;
            }
        }

他们还有一个for循环所以它可能不是你想要的,但仍然是我的2美分......

:)

答案 4 :(得分:0)

为什么不简单(这将创建可枚举的副本):

myApps.Join(yourApps, 
            m => m.Key, 
            y => y.Key, 
            (m, y) => new { m, y.description })
      .ToList()
      .ForEach(c => c.m.description = c.description);