You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现<int, List<int>>类型字典的按值复制?

如何实现Dictionary<int, List>的按值复制(深拷贝)

嘿,这个坑我之前踩过!你用的new Dictionary<int, List<int>>(d1)确实只是做了浅拷贝——它会复制字典里的键值对,但每个List<int>仍然是原字典中列表的引用,也就是说修改d2里的列表内容时,d1对应的列表也会跟着变,这肯定不是你想要的效果。

下面给你两种简单有效的实现方式:

方法一:用LINQ快速实现

直接通过ToDictionary方法,为每个键对应的列表创建一个新的副本:

Dictionary<int, List<int>> d2 = d1.ToDictionary(
    kvp => kvp.Key,  // int是值类型,直接复制即可
    kvp => new List<int>(kvp.Value)  // 新建List并复制原列表的所有元素
);

这种方式简洁明了,适合一次性的拷贝需求。

方法二:封装成扩展方法(复用性更好)

如果你的代码里需要多次做这种深拷贝操作,可以写一个扩展方法,让代码更整洁:

public static class DictionaryExtensions
{
    public static Dictionary<TKey, List<TValue>> DeepCopy<TKey, TValue>(this Dictionary<TKey, List<TValue>> source)
        where TKey : notnull  // 字典键必须是非空类型,符合Dictionary的约束
    {
        var copiedDict = new Dictionary<TKey, List<TValue>>();
        foreach (var keyValuePair in source)
        {
            // 为每个列表创建独立副本
            copiedDict.Add(keyValuePair.Key, new List<TValue>(keyValuePair.Value));
        }
        return copiedDict;
    }
}

使用的时候就非常简单了:

var d2 = d1.DeepCopy();

小提醒

如果你的列表里存的不是int这种值类型,而是自定义的引用类型,那你还需要对列表里的每个元素也做深拷贝才行,但针对你当前的int List场景,上面两种方法完全够用啦。

内容的提问来源于stack exchange,提问作者coderD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:57