stevenjin 2024-07-16 11:11 采纳率: 97.3%
浏览 6
已结题

c# 更新concurrentdictionary中多个集合中的某一个

1.在ConcurrentDictionary字典中,有多个集合
2.在用AddOrUpdate更新时,如果只需要更新某一个集合,其他没赋值,就会为空
3.目前先Clear掉这个要更新的集合,再用AddRanage单独更新
不知有没有更好的方法?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-16 11:11
    关注

    引自免费微信小程序:皆我百晓生

    在C#中,使用ConcurrentDictionary时,如果你想更新其中的一个集合而不影响其他的集合,可以采取几种策略来处理。考虑到你的需求,可以采取以下步骤来实现这一目标:

    首先,假设你的ConcurrentDictionary中的键是字符串(或其他类型),值是集合(比如List<T>或其他可更新的集合类型)。假设你有一个特定的键,你想更新其对应的集合而不影响其他集合。一种方法是先检索出当前集合,对其进行修改,然后再放回ConcurrentDictionary中。这样做的好处是你可以精确地控制哪些部分需要更新。以下是代码示例:

    ConcurrentDictionary<string, List<int>> concurrentDictionary = new ConcurrentDictionary<string, List<int>>();
    
    // 添加或更新集合中的特定项,而不影响其他项。假设你想更新键为"keyToUpdate"的集合。
    void UpdateSpecificCollection(string keyToUpdate)
    {
        List<int> oldList; // 用于存储旧集合的临时变量
        List<int> newList; // 用于存储新集合的临时变量
        
        // 使用TryGetValue安全地获取键对应的旧集合,如果键不存在则返回null。
        if (concurrentDictionary.TryGetValue(keyToUpdate, out oldList))
        {
            // 如果旧集合存在并且需要进行更新操作的话,对其进行修改并添加新的元素或更新已有元素。这里是一个简单的例子:添加新元素到列表中。
            newList = new List<int>(oldList); // 创建旧列表的副本以避免并发问题
            newList.Add(新的元素); // 添加新元素到新的列表中
            // 其他需要的修改...
            // ... 省略其他修改代码 ... 
            // 更新ConcurrentDictionary中的集合。使用AddOrUpdate确保在更新时不会有其他线程介入并干扰我们更新过程。              
            concurrentDictionary.AddOrUpdate(keyToUpdate, newList, (k, v) => v); // 使用旧列表直接更新而不进行合并操作(因为已经创建了副本)
        }
        else
        {
            // 键不存在于字典中时的处理逻辑(比如初始化新的集合等)这里假设我们要添加一个新列表作为默认值。         
            newList = new List<int>(); // 新建一个空的列表作为初始值或者根据需要设置初始状态的值。         
            concurrentDictionary.AddOrUpdate(keyToUpdate, newList, (k, v) => v); // 添加新集合到字典中,或者如果有其他集合存在则不进行操作。        
        }        
    } 
    ``` 需要注意的是在使用`AddOrUpdate`时不会合并两个集合的内容(如果其他线程此时试图添加新内容到同一键下)。它要么添加新值要么不做任何操作(如果已经存在该键),不会合并内容或追加到其他现有集合上。所以,在上述代码中创建旧列表的副本是很重要的步骤,确保不会与其他线程更新的内容发生冲突。 如果你需要合并两个集合或者同时更新多个集合内容,可能需要实现更复杂的逻辑来处理并发更新的情况。 如果你的场景需要更复杂的并发控制或合并逻辑,可能需要使用锁或其他同步机制来保证操作原子性和安全性。然而在实际开发中很少这样做,因为这通常比较复杂并且会影响并发性能。 所以如果你的场景中某个键对应的集合需要被更新而其他键对应的集合不受影响的话,上述代码应该是一个很好的解决方案。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月16日

悬赏问题

  • ¥15 网络分析设施点无法识别
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决
  • ¥100 基于SVM的信息粒化时序回归预测,有偿求解!
  • ¥15 物体组批优化问题-数学建模求解答
  • ¥15 微信原生小程序tabBar编译报错
  • ¥350 麦克风声源定位坐标不准
  • ¥15 apifox与swagger使用
  • ¥15 egg异步请求返回404的问题