C#浅复制字典?

30

我需要在C#中进行浅拷贝字典。

例如:

Dictionary<int,int> flags = new Dictionary<int,int>();
flags[1] = 2;
flags[2] = 3;
flags[0] = 9001;
Dictionary<int,int> flagsn = flags.MemberwiseClone();

不幸的是,这会返回错误:"error CS1540: Cannot access protected member object.MemberwiseClone()通过类型为System.Collections.Generic.Dictionary的限定符访问受保护的成员。该限定符必须是类型为`PointFlagger'或派生自它"

不太确定这意味着什么... 是否有另一种方法可以浅复制字典/修复我上面的代码?

2个回答

63

要获得浅拷贝,只需要使用 Dictionary<TKey, TValue> 的构造函数,因为它接受一个 IEnumerable<KeyValuePair<TKey, TValue>>。它会将这个集合添加到新实例中。

Dictionary<int, int> flagsn = new Dictionary<int, int>(flags);

1
@Jared,实际上,它似乎不接受 IEnumerable<KeyValuePair>,而是一个 IDictionary<TKey, TValue> 字典 - user3638471

10

我找到了一种通用的方式,您不需要明确编写任何类型。出于可维护性的原因,我更喜欢这种方式:

var ShallowCopy = OriginalDictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

在这个上下文中,“kvp => kvp.Key,kvp => kvp.Value”是什么意思?我该如何添加键和值?它在我的端口显示错误。 - Pratik
2
你需要添加一个 System.Linq 的 using 语句来访问 ToDictionary() 扩展方法。 - Johnathon Sullinger
1
我强烈建议不要这样做。虽然LINQ调用在深复制时非常有用,但如果你只想进行浅复制,则会带来巨大的性能负面影响。 - Dmitri Nesteruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接