C# 从ConcurrentDictionary中删除多个元素
我有以下代码:C# 从ConcurrentDictionary中删除多个元素,c#,asp.net,C#,Asp.net,我有以下代码: public class Item { public string key { get; set; } public string Value { get; set; } } 私有ConcurrentDictionary存储项{get;set;} 私有void重新加载(IEnumerable newItems) { foreach(newItems中的项) { StorageItems.AddOrUpdate(item.key,item.Value,(s,o)=>
public class Item
{
public string key { get; set; }
public string Value { get; set; }
}
私有ConcurrentDictionary存储项{get;set;}
私有void重新加载(IEnumerable newItems)
{
foreach(newItems中的项)
{
StorageItems.AddOrUpdate(item.key,item.Value,(s,o)=>item.Value);
}
//TODO从StorageItems中删除newItems不包含的项
}
我有以下想法,但我不确定是否要从循环体内部的ConcurrentDictionary中删除元素:
private void ReloadIdea(IEnumerable<Item> newItems)
{
List<string> addedOrUpdatedKeys = new List<string>();
foreach (Item item in newItems)
{
StorageItems.AddOrUpdate(item.key, item.Value, (s, o) => item.Value);
addedOrUpdatedKeys.Add(item.key);
}
foreach (string key in StorageItems.Keys)
{
if (!addedOrUpdatedKeys.Contains(key))
{
string removedValue;
StorageItems.TryRemove(key, out removedValue); // <-- Removing items from collection that is iterating ??
}
}
}
private void reloadea(IEnumerable newItems)
{
List addedOrUpdatedKeys=新列表();
foreach(newItems中的项)
{
StorageItems.AddOrUpdate(item.key,item.Value,(s,o)=>item.Value);
addedOrUpdatedKeys.Add(item.key);
}
foreach(StorageItems.Keys中的字符串键)
{
如果(!addedOrUpdatedKeys.Contains(key))
{
字符串移除值;
TryRemove(key,out removedValue);//编辑:删除误导性代码更改
由于它是一个ConcurrentDictionary
,竞争条件已经由集合本身处理。此外,它不会遭受可怕的“集合在枚举时被修改”的影响如果在foreach循环期间修改它,则会出错。谢谢。这是因为它是一个ConcurrentDictionary。如果我使用的是公共字典或列表,则在foreach循环期间我无法修改它,对吗?是的,普通字典在迭代期间基本上是不可变的。下一次迭代将引发我提到的异常。我需要知道StorageItems是否继续ns一个不在addedOrUpdatedKeys中的键。这是因为我在尝试删除之前检查(!addedOrUpdatedKeys.Contains(key))。我的坏!不应该删除该if()
,是的,需要if(),但您不必担心修改,因为CD不像正常的CD那样抛出。
private void ReloadIdea(IEnumerable<Item> newItems)
{
List<string> addedOrUpdatedKeys = new List<string>();
foreach (Item item in newItems)
{
StorageItems.AddOrUpdate(item.key, item.Value, (s, o) => item.Value);
addedOrUpdatedKeys.Add(item.key);
}
foreach (string key in StorageItems.Keys)
{
if (!addedOrUpdatedKeys.Contains(key))
{
string removedValue;
StorageItems.TryRemove(key, out removedValue); // <-- Removing items from collection that is iterating ??
}
}
}