一、複製克隆
在編程中時常遇到想要去操作某個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
}