假设我有一个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);
答案 0 :(得分:1)
答案 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);
}