一、复制克隆
在编程中时常遇到想要去操作某个List集合而又不想破坏原有List的情况。如果仅仅是新建一个新List,将旧List的值赋值给新List的话,改变复制后的List,那么原有的List也会变化,并没有起到备份原始数据的作用,对于没有嵌套的List,可以采用遍历重新赋值的方法去赋值(传递的是值类型,并非引用类型),若List内的数据是一个类的话,赋值的时候需要重新实例化才行。但如果是嵌套的List列表,遍历这种方法就麻烦了很多。
拓展:c#中有两种基本类型,它们分别是值类型和引用类型;其中类和数组属于引用类型。
因此,常见的对List进行复制克隆的方法如下:
1、值类型集合的复制克隆
private void Test()
{
List<object> lis = new List<object> { 1,2 };
List<object> lis1 = lis; //结果["sss",2]
//方法一
List<object> lis2 = new List<object>();
lis.ForEach(x=>lis2.Add(x)); //结果[1,2]
//方法二
List<object> lis3 = lis.ToArray().ToList(); //结果[1,2]
//变化第一个值
lis[0] = "sss";
}
2、引用类型集合的复制克隆
[Serializable]
public class People
{
public string Name { get; set; }
public int Age { get; set; }
}
private void Test()
{
List<People> peoples1 = new List<People> { new People { Name = "张三", Age = 10 }, new People { Name = "小红", Age = 10 } };
//方法一 copy peoples1 to peoples2
List<People> peoples2 = peoples1.ConvertAll<People>(x => { return new People { Name = x.Name, Age = x.Age }; });
//方法二
List<People> peoples3 = Clone(peoples1) as List<People>;
//方法三 需要引用Newtonsoft.Json.dll
List<People> peoples4= JsonConvert.DeserializeObject<List<People>>(JsonConvert.SerializeObject(peoples1));
}
/// <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);
}
二、比较两个List集合是否相等
根据相等比较器确定两个序列是否相等。
1、值类型比较
/// <summary>
/// 值类型集合比较
/// </summary>
private void Test()
{
List<int> lis1 = new List<int> { 1, 2, 3 };
List<int> lis2 = new List<int> { 1, 2, 3 };
var c = lis1.SequenceEqual(lis2); //结果 true
}
2、对象集合比较
//如果要比较序列中对象的实际数据而不是仅仅比较它们的引用,则必须在类中实现IEqualityComparer<T> 泛型接口
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;
}
}
/// <summary>
/// 对象集合比较
/// </summary>
private void Test()
{
List<People> peoples1 = new List<People> { new People { Name = "张三", Age = 10 }, new People { Name = "小红", Age = 10 } };
List<People> peoples2 = new List<People> { new People { Name = "张三", Age = 10 }, new People { Name = "小红", Age = 10 } };
var b = peoples1.SequenceEqual(peoples2); //true
}