C#List克隆複製副本及比較是否相等

一、複製克隆      

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章