我有两个颜色
List<Application> myApps;
List<Application> yourApps;
这些列表具有重叠的重叠数据,但它们来自不同的来源,每个来源都有一些缺少的字段数据。
应用对象有一个名为描述
的属性两个系列都有一个名为键
的唯一字段我想看看是否有LINQ解决方案:
遍历 myApps 中的所有应用,然后查看密钥,看看 yourApps 中是否存在该密钥。如果是,我想在您的应用中从该应用程序中获取 description 属性,并将 myApps 上的应用程序的description属性设置为相同的值
我想看看是否有使用lambda表达式的光滑方式(而不是必须有循环和一些if语句。)
答案 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);