【问题标题】:Does For loop check linq expression at each iteration [closed]For循环是否在每次迭代时检查linq表达式[关闭]
【发布时间】:2017-04-27 14:02:27
【问题描述】:

具有以下 for 循环:

        for (var i = list.Count - 1; i >= list.OrderBy(x => x).First(); i--)
            if (list.Contains(i))
                list.RemoveAt(i);
  1. 是否每次迭代都会检查 list.Count()
  2. list.OrderBy(x => x.Key).First() 每次迭代都会执行吗
  3. 这应该是线程安全的吗?因为添加/删除?

我的意思是,在 for 循环执行期间,项目可能会被添加到列表中(在其他地方——在不同的方法中)

【问题讨论】:

  • 使用调试器单步调试代码,并确切地查看调用的内容和时间。 (也就是说,您不会在显示的 sn-p 中的任何位置调用 list.Count(),因此它不会被调用根本。)
  • for 循环的第一部分在其他两个部分每次迭代执行一次后执行。
  • 是的,orderby 将被执行。
  • @Servy,for 循环的第一部分是var i = list.Count() - 1
  • @juharr 查看修订历史。他们在我评论后编辑了代码。

标签: c# .net


【解决方案1】:

1:否,因为它只是起始值。这部分在循环开始时只会被访问一次

2:是的,因为必须对 linq 表达式求值才能得到结果值。如果您想避免它在循环之前执行一次 linq 表达式并将其保存到单独的值中:

int end = list.OrderBy(x => x.Key).First(); 
for (var i = list.Count() - 1; i >= end; i--) 
    if (list.ContainsKey(i))
        list.RemoveAt(i)

编辑:

如果您的列表可能会动态变化,那么您现在使用它的方式当然是一个更可取的解决方案,因为您可以适应变化。

至于问题 3:this Answer 表示 Add 方法不是线程安全

【讨论】:

  • 就是这样,在 for 迭代期间,列表可能会从其他地方删除/添加到其他地方。这就是我不想将其保存在变量中的原因
  • @BobSwanson 那么您可以按照您现在使用的方式在线适应更改。 listDictionary 吗?
  • @BobSwanson:如果没有某种锁定,你不会让这个线程安全。
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
相关资源
最近更新 更多