C# Dictionary深拷贝
时间: 2023-11-22 21:44:42 浏览: 194
C#中的Dictionary是引用类型,因此默认情况下进行赋值或传递参数时是浅拷贝,即两个变量指向同一个对象。如果需要进行深拷贝,可以使用序列化和反序列化的方式来实现。具体步骤如下:
1. 将Dictionary对象序列化为二进制流
2. 将二进制流反序列化为新的Dictionary对象
示例代码如下:
```csharp
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public static Dictionary<TKey, TValue> DeepCopy<TKey, TValue>(Dictionary<TKey, TValue> original)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, original);
ms.Position = 0;
return (Dictionary<TKey, TValue>)formatter.Deserialize(ms);
}
}
```
相关问题
c# dictionary深拷贝
在 C# 中,Dictionary 类型是引用类型,因此默认情况下,对 Dictionary 进行赋值或传递给其他变量时,只会复制引用而不是实际的数据。如果希望进行深拷贝(即创建一个新的 Dictionary,同时复制其中的键值对),可以使用以下方法之一:
1. 使用循环手动复制键值对:
```csharp
Dictionary<TKey, TValue> original = new Dictionary<TKey, TValue>();
// 假设 original 包含一些键值对
Dictionary<TKey, TValue> clone = new Dictionary<TKey, TValue>();
foreach (var kvp in original)
{
clone.Add(kvp.Key, kvp.Value);
}
```
2. 使用 LINQ 扩展方法进行复制:
```csharp
Dictionary<TKey, TValue> original = new Dictionary<TKey, TValue>();
// 假设 original 包含一些键值对
Dictionary<TKey, TValue> clone = original.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
```
请注意,上述方法仅适用于 Dictionary 的键和值是值类型或不可变引用类型的情况。如果 Dictionary 的值是可变引用类型,并且需要进行深拷贝,请确保该类型支持深拷贝操作,或者自定义实现该类型的深拷贝逻辑。
C# dictionary 深拷贝
在 C# 中,可以使用序列化和反序列化来实现 dictionary 的深拷贝。具体的步骤如下:
1. 将 dictionary 序列化为一个字符串:
```csharp
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
public static string SerializeObject(object obj)
{
var serializer = new DataContractJsonSerializer(obj.GetType());
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
var originalDictionary = new Dictionary<string, int>();
// 添加键值对
var serializedDictionary = SerializeObject(originalDictionary);
```
2. 将字符串反序列化为一个新的 dictionary 对象:
```csharp
public static T DeserializeObject<T>(string json)
{
var serializer = new DataContractJsonSerializer(typeof(T));
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
var result = (T)serializer.ReadObject(ms);
return result;
}
}
var newDictionary = DeserializeObject<Dictionary<string, int>>(serializedDictionary);
```
这样就实现了 dictionary 的深拷贝。注意,需要在 dictionary 的 value 中存储可序列化的对象。
阅读全文