LINQ on循环条件

Mat*_*ero 6 .net c# linq iteration loops

我们假设我有以下代码:

IEnumerable<string> allKeys = _cache.Select(o => o.Key);
Parallel.ForEach(allKeys, key => _cache.Remove(key));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在检索所有密钥_cache,将它们存储在我的本地变量中allKeys,然后同时从中删除所有密钥_cache.

但是,我想要做一行.所以我想到的是:

Parallel.ForEach(_cache.Select(o => o.Key), key => _cache.Remove(key));
Run Code Online (Sandbox Code Playgroud)

但是_cache.Select(o => o.Key)每次循环迭代都会调用该语句,因此每次都会检索不同数量的元素(因为我正在同时删除它们).

后一行代码是否安全?

是否_cache.Select(o => o.Key)在循环语句,只被调用一次,然后每一次迭代使用原来的结果,抑或是在每个迭代步骤处理?

Dan*_*rth 4

首先,两个代码是相同的。有没有临时变量没有区别。

第二:这段代码有缺陷。

  1. LINQ 使用延迟执行。换句话说,在迭代时 allKeys,底层数据(在您的情况下_cache)正在被迭代。与删除结合起来,这将不起作用。
  2. _cache最有可能的是一本普通的字典或类似的东西。换句话说,它不是线程安全的。更新:根据评论,它是类型,ObjectCache并且该类型确实是线程安全的。因此,在您的具体情况下不会出现此问题。