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

时间:2018-09-17 12:04:34

标签: 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);

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

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

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

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

dict.TryAdd("2_someA_someB_someC", obj2);
dict.TryAdd("3_someA_someB_someC", obj3);

4 个答案:

答案 0 :(得分:1)

  1. 解析第一个下划线之前的数字(提示:IndexOfSubstring
  2. 将其转换为整数(提示:int.TryParse
  3. 将数字与值进行比较(在这种情况下为2)
  4. 过滤应用此方法的键,并将其存储在集合中。遍历该集合并调用TryRemove方法以删除与该键关联的条目。

答案 1 :(得分:0)

您需要遍历字典,以收集符合条件的键,然后遍历从字典中删除的键列表。字典中的for-each会返回具有Key和Value属性的项目,因此您可以检查Key属性来决定是否删除。您不能在同一循环中删除,否则会导致错误。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您可以使用Split将密钥拆分为_字符的数组,将结果数组中的第一项转换为int(请注意,如果密钥不是以int开头),如果小于2,请从字典中将其删除:

foreach (var item in dict.Where(kvp => int.Parse(kvp.Key.Split('_')[0]) < 2))
{
    SomeObject tempObject;
    dict.TryRemove(item.Key, out tempObject);
}