C# 更新列表时用lambda替换foreach

C# 更新列表时用lambda替换foreach,c#,linq,foreach,lambda,C#,Linq,Foreach,Lambda,我想通过从vlist获取值来更新vmlist,而不使用任何foreach循环 现在我只是用foreach循环来做这件事,但我想用LINQ替换这个foreach foreach (var item in vlist){ vmlist.Where(list => list.SId==item.SId && list.ParameterId==item.ParameterId && list.WId==item.WId) .Select(li =&

我想通过从vlist获取值来更新vmlist,而不使用任何foreach循环

现在我只是用foreach循环来做这件事,但我想用LINQ替换这个foreach

foreach (var item in vlist){
    vmlist.Where(list => list.SId==item.SId && list.ParameterId==item.ParameterId && list.WId==item.WId)
    .Select(li => { li.Value = item.Value; return li; }).ToList();
}

您当前的方法非常低效-它在*M上,并且在每次迭代中创建一个列表

使用联接会更有效-我仍然会使用foreach循环,但会将查询部分与更新部分分开:

var pairsToUpdate = from original in vmlist
                    join item in vlist
                      on new { original.SId, original.ParameterId, original.WId }
                      equals new { item.SId, item.ParameterId, item.WId }
                    select new { original, item };

foreach (var pair in pairsToUpdate)
{
    pair.original.Value = pair.item.Value;
}
没有滥用Select的副作用 没有任何理由创建额外的列表 更有效地选择要更新的项目
您当前的方法非常低效-它在*M上,并且在每次迭代中创建一个列表

使用联接会更有效-我仍然会使用foreach循环,但会将查询部分与更新部分分开:

var pairsToUpdate = from original in vmlist
                    join item in vlist
                      on new { original.SId, original.ParameterId, original.WId }
                      equals new { item.SId, item.ParameterId, item.WId }
                    select new { original, item };

foreach (var pair in pairsToUpdate)
{
    pair.original.Value = pair.item.Value;
}
没有滥用Select的副作用 没有任何理由创建额外的列表 更有效地选择要更新的项目
为什么不想使用foreach循环?就我个人而言,我肯定会在这里使用嵌套的foreach循环,而不是你目前滥用LINQ来包括副作用和ToList的强制评估。。。lambda表达式只是C中语法的一个元素。顺便说一句,嵌套foreach的另一个替代方法是连接。我认为使用foreach执行会很耗时。那么您还不了解当前代码的功能,或者LINQ是如何工作的。我知道已经有嵌套迭代,但是我只是想避免foreach为什么不使用foreach循环呢?就我个人而言,我肯定会在这里使用嵌套的foreach循环,而不是你目前滥用LINQ来包括副作用和ToList的强制评估。。。lambda表达式只是C中语法的一个元素。顺便说一句,嵌套foreach的另一个替代方法是连接。我认为使用foreach执行非常耗时。那么您还不了解当前代码的功能,或者LINQ是如何工作的。我知道已经有嵌套迭代,但我只想避免foreach