【发布时间】:2015-08-19 03:23:27
【问题描述】:
假设我有以下代码:
IEnumerable<string> allKeys = _cache.Select(o => o.Key);
Parallel.ForEach(allKeys, key => _cache.Remove(key));
如您所见,我正在检索_cache 中的所有键,将它们存储在我的局部变量allKeys 中,然后同时从_cache 中删除所有键。
但是,我想用一行来完成。所以想到的是:
Parallel.ForEach(_cache.Select(o => o.Key), key => _cache.Remove(key));
但是语句_cache.Select(o => o.Key) 会在每次循环迭代时被调用,因此每次检索的元素数量都不同(因为我同时删除了它们)。
后一行代码安全吗?
_cache.Select(o => o.Key)在循环语句中,是否只被调用一次,然后每次迭代都使用原始结果,还是在每个迭代步骤中处理?
【问题讨论】:
-
_cache是什么类型的?
-
在一行中这样做有什么好处?
-
“但是语句 _cache.Select(o => o.Key) 会在每次循环迭代时被调用” - 你确定吗?
-
@Paddy
_cache的类型为ObjectCacheDocumentation -
不管并行度如何,您都不能在迭代枚举时对其进行变异。您需要在删除之前实现
allKeys。
标签: c# .net linq loops iteration