【问题标题】:Replace foreach with lambda while updating list更新列表时用 lambda 替换 foreach
【发布时间】:2016-03-17 08:09:32
【问题描述】:

我想通过从 vlist 获取值而不使用任何 foreach 循环来更新 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();
}

【问题讨论】:

  • 为什么您不想使用foreach 循环?就我个人而言,我肯定会在这里使用嵌套的 foreach 循环,而不是您当前滥用 LINQ 来包含副作用并使用 ToList 强制评估。
  • 请注意,当您说“lambda”时,您的真正意思是“LINQ”...... lambda 表达式只是 C# 中的一个语法元素。顺便说一句,嵌套 foreach 的替代方法是连接。
  • 我认为使用 foreach 执行很耗时
  • 那你还没有理解你当前的代码是做什么的,或者 LINQ 是如何工作的。
  • 我知道已经有嵌套迭代,但我只是想避免 foreach

标签: c# linq foreach lambda


【解决方案1】:

您当前的方法效率非常低 - 它是 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 并产生副作用
  • 不会无故创建额外的列表
  • 更有效地选择要更新的项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2023-02-23
    • 2018-02-17
    • 2019-06-09
    相关资源
    最近更新 更多