gpt4 book ai didi

c# - ConcurrentDictionary.ElementAt 返回什么元素

转载 作者:行者123 更新时间:2023-11-30 22:58:03 25 4
gpt4 key购买 nike

在我的代码中,我得到了一个 ConcurrentDictionary,现在我想遍历 Dictionary 中的每个元素,但是如果条件为真,我想从这个 Dictionary 中删除一个元素,所以我不能使用 foreach 循环。也可能会发生 Dictionary 在循环中获得一个新元素或从另一个线程中删除一个元素。经过一些研究后,我最终使用了 ElementAt。

现在我的问题是 ConcurrentDictionary 是否会像 List 一样再次释放索引。这样第一个元素的索引将始终为 0。

这是我的代码的样子,CommandHandler.Timeouter 来自 ConcurrentDictionary:

int current = 0;

while (CommandHandler.Timeouter.Count() > current)
{
var info = CommandHandler.Timeouter.ElementAt(current);
var timeoutcooldown = info.Value.LastCommandTime.AddMinutes(1);

if (timeoutcooldown < DateTime.UtcNow)
{
CommandHandler.Timeouter.TryRemove(info.Key, out _);
}
else current++;
}

最佳答案

ElementAt只是将字典视为 IEnumerable<KeyValuePair<TKey, TValue>> .字典没有顺序。因此该索引毫无意义。想想元素每次都以随机顺序返回。另外,ElementAt没有办法使这个线程安全。

看来你想实现缓存过期。考虑只使用 lock访问普通字典。如果没有太多争用,这将是最简单且速度非常快的解决方案。

这个循环的替代代码模式是这样的:

var itemsToExpire = myDict.Where(/* compute expiration */).ToList();
foreach (var item in itemsToExpire)
myDict.Remove(item);

不需要任何复杂的循环。

关于c# - ConcurrentDictionary.ElementAt 返回什么元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53247606/

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