代码之家  ›  专栏  ›  技术社区  ›  pookie

基于条件键从ConcurrentDictionary中删除多个项

  •  -1
  • pookie  · 技术社区  · 6 年前

    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>_ 在keys是递增的并且是字典的情况下,不能保证元素是有序的。

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

    我怎样才能从字典中删除所有的元素谁的键以小于的值开头 2 ?

    dict.TryAdd("2_someA_someB_someC", obj2);
    dict.TryAdd("3_someA_someB_someC", obj3);
    
    4 回复  |  直到 6 年前
        1
  •  3
  •   Tim Schmelter    6 年前

    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的键。 此列表将用于从字典中删除项。当然你需要一个锁来保证线程的安全。

        2
  •  1
  •   Selman Genç    6 年前
    1. 分析第一个下划线之前的数字(提示: IndexOf Substring )
    2. int.TryParse )
    3. 将数字与值进行比较(本例中为2)
    4. 应用此方法筛选键,并将它们存储在集合中。迭代集合并调用 TryRemove 方法删除与键关联的项。
        3
  •  0
  •   open-collar    6 年前

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

        4
  •  0
  •   Rufus L    6 年前

    你可以用 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);
    }
    
    推荐文章