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 ??
            }
        }
    }