一、复制克隆
用等号直接Dictionary1 = Dictionary2,复制过去的是地址(赋址),这时改变Dictionary2,Dictionary1也会被改变。普遍的是我们常常在改变复制后的值时不希望改变原有的值。这时就需要赋值而不是赋址。可用下列方法进行赋值:
private void Test()
{
Dictionary<string, string> dic = new Dictionary<string, string> { { "A", "a" }, { "B", "b" } };
//方法一
Dictionary<string, string> dic1 = new Dictionary<string, string>(dic);
//方法二
Dictionary<string, string> dic2 = Clone(dic) as Dictionary<string, string>;
//方法三 --需要引用Newtonsoft.Json.dll
Dictionary<string, string> dic3 = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(dic2));
}
采用序列化和反序列化
/// <summary>
/// 得到一个对象的克隆(二进制的序列化和反序列化)--需要标记可序列化
/// </summary>
public static object Clone(object obj)
{
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, obj);
memoryStream.Position = 0;
return formatter.Deserialize(memoryStream);
}
当值为引用类型时
[Serializable]
public class People : IEquatable<People>
{
public string Name { get; set; }
public int Age { get; set; }
public bool Equals(People other)
{
if (other is null)
return false;
return this.Name == other.Name && this.Age == other.Age;
}
}
private void Test()
{
Dictionary<string, People> dic = new Dictionary<string, People> { { "A", new People {Name="SD",Age=0 } }, { "B", new People { Name = "FD", Age = 1 } } };
//方法一
Dictionary<string, People> dic2 = Clone(dic) as Dictionary<string, People>;
//方法二 --需要引用Newtonsoft.Json.dll
Dictionary<string, People> dic3 = JsonConvert.DeserializeObject<Dictionary<string, People>>(JsonConvert.SerializeObject(dic2));
}
二、比较两个Dictionary是否相等
/// <summary>
/// 比较
/// </summary>
private void Test()
{
Dictionary<string, object> dic = new Dictionary<string, object> { { "A", 1 }, { "B", "b" } };
Dictionary<string, object> dic2 = new Dictionary<string, object> { { "A", 1 }, { "B", "b" } };
var a = dic.Equals(dic2); //结果 false
var b = dic.SequenceEqual(dic2); //结果 true
}
更多推荐
C#Dictionary复制克隆副本及比较是否相等
发布评论