根据条件键从 ConcurrentDictionary 中删除多个项目

poo*_*kie 1 c# concurrentdictionary

假设我有一个ConcurrentDictionary

var dict = new ConcurrentDictionary<string, someObject>();
dict.TryAdd("0_someA_someB_someC", obj0);
dict.TryAdd("1_someA_someB_someC", obj1);
dict.TryAdd("2_someA_someB_someC", obj2);
dict.TryAdd("3_someA_someB_someC", obj3);
Run Code Online (Sandbox Code Playgroud)

键中的<number>_是递增的并且是字典,不能保证元素是按顺序排列的。

现在,假设我想从字典中删除所有小于 的number项目2。我不知道这些键会是什么样子,只知道它们会以上面的数字为前缀。

如何从字典中删除键以小于值开头的所有元素2

例如,此过程后生成的字典将如下所示:

dict.TryAdd("2_someA_someB_someC", obj2);
dict.TryAdd("3_someA_someB_someC", obj3);
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 5

假设它始终具有这种格式,您可以使用 LINQ:

var keysToRemove = dict.Keys.Where(key => int.Parse(key.Remove(key.IndexOf('_'))) < 2).ToList();
keysToRemove.ForEach(key => dict.TryRemove(key, out someObject obj));
Run Code Online (Sandbox Code Playgroud)

String.Remove删除从 开始的部分_,然后解析剩余的第一部分,即数字。它只会选择数字小于 2 的键。该列表将用于从字典中删除项目。当然,你需要一个锁来保证线程安全。

  • @pookie:并发集合提供*单独的操作*,这些操作可以有效并发而无需进一步锁定。一旦你想以全有或全无的方式做不止一件事,天下仍然没有免费的午餐。考虑以下情况:此代码获取所有键,然后另一个线程插入更多也与检查匹配的键。当这个循环结束时,这些钥匙不会消失。同样,如果另一个线程删除然后插入具有新值的匹配键,则此代码可以删除该值,这可能是也可能不是您想要的。 (2认同)