gpt4 book ai didi

c# - LINQ on 循环条件

转载 作者:太空狗 更新时间:2023-10-29 21:17:04 26 4
gpt4 key购买 nike

假设我有以下代码:

IEnumerable<string> allKeys = _cache.Select(o => o.Key);
Parallel.ForEach(allKeys, key => _cache.Remove(key));

如您所见,我正在检索 _cache 中的所有键,将它们存储在我的本地变量 allKeys 中,然后同时从 中删除所有键>_缓存

不过,我想在一行中完成。所以想到的是:

Parallel.ForEach(_cache.Select(o => o.Key), key => _cache.Remove(key));

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

后一行代码安全吗?

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

最佳答案

As you can see, I'm retrieving all the keys in _cache, storing them in my local variable allKeys

不,你不知道。由于称为延迟执行的东西,您存储的只是获取所有 key 的命令。您需要具体化此命令以实际执行您认为的操作:

var allKeys = _cache.Select(o => o.Key).ToList();

也就是说:您的缓存线程安全吗?为什么它没有 Clear 方法?使用多线程获取所有键并删除它似乎不是一个好主意。

如果您坚持将所有内容都放在一行中,您可以使用 PLINQ:

_cache.Select(o => o.Key).AsParallel().ForAll(key => _cache.Remove(key));

但再次重申:这似乎是个坏主意。

关于c# - LINQ on 循环条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30645137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com