在更新列表时用foreda替换foreach

时间:2015-12-11 12:01:02

标签: c# linq foreach lambda

我想通过在不使用任何foreach循环的情况下从vlist中创建值来更新vmlist。

目前我只是使用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();
}

1 个答案:

答案 0 :(得分:4)

您当前的方法效率非常低 - 它是O(N * 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副作用
  • 没有充分理由创建额外列表
  • 更有效地选择要更新的项目