最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 使用Dictionary復制克隆副本及比較是否相等

 更新時間:2020年12月09日 09:44:49   作者:秋漓  
這篇文章主要介紹了C# 使用Dictionary復制克隆副本及比較是否相等,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、復制克隆

用等號直接Dictionary1 = Dictionary2,復制過去的是地址(賦址),這時改變Dictionary2,Dictionary1也會被改變。普遍的是我們常常在改變復制后的值時不希望改變原有的值。這時就需要賦值而不是賦址??捎孟铝蟹椒ㄟM行賦值:

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); //結(jié)果 false
 var b = dic.SequenceEqual(dic2); //結(jié)果 true
}

補充知識:C#中的深復制和淺復制(在C#中克隆對象)

C# 支持兩種類型:“值類型”和“引用類型”。

值類型(Value Type)(如 char、int 和 float)、枚舉類型和結(jié)構(gòu)類型。

引用類型(Reference Type) 包括類 (Class) 類型、接口類型、委托類型和數(shù)組類型。

如何來劃分它們?

以它們在計算機內(nèi)存中如何分配來劃分

值類型與引用類型的區(qū)別?

1,值類型的變量直接包含其數(shù)據(jù),

2,引用類型的變量則存儲對象引用。

對于引用類型,兩個變量可能引用同一個對象,因此對一個變量的操作可能影響另一個變量所引用的對象。對于值類型,每個變量都有自己的數(shù)據(jù)副本,對一個變量的操作不可能影響另一個變量。

值類型隱式繼承自System.ValueType 所以不能顯示讓一個結(jié)構(gòu)繼承一個類,C#不支持多繼承

堆棧(stack)是一種先進先出的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中,變量會被分配在堆棧上來進行操作。

堆(heap)是用于為類型實例(對象)分配空間的內(nèi)存區(qū)域,在堆上創(chuàng)建一個對象,

會將對象的地址傳給堆棧上的變量(反過來叫變量指向此對象,或者變量引用此對象)。

關(guān)于對象克隆的所設計到知識點

淺拷貝:

是指將對象中的所有字段逐字復雜到一個新對象

對值類型字段只是簡單的拷貝一個副本到目標對象,改變目標對象中值類型字段的值不會反映到原始對象中,因為拷貝的是副本

對引用型字段則是指拷貝他的一個引用到目標對象。改變目標對象中引用類型字段的值它將反映到原始對象中,因為拷貝的是指向堆是上的一個地址

深拷貝:

深拷貝與淺拷貝不同的是對于引用字段的處理,深拷貝將會在新對象中創(chuàng)建一個新的對象和原始對象中對應字段相同(內(nèi)容相同)的字段,也就是說這個引用和原始對象的引用是不同, 我們改變新

對象中這個字段的時候是不會影響到原始對象中對應字段的內(nèi)容。

淺復制: 實現(xiàn)淺復制需要使用Object類的MemberwiseClone方法用于創(chuàng)建一個淺表副本

深復制: 須實現(xiàn) ICloneable接口中的Clone方法,且需要需要克隆的對象加上[Serializable]特性

namespace DeepCopy
{
 class DrawBase : System.Object, ICloneable
 {
  public List<string> listName = new List<string>();
  public string name = "old";
  public DrawBase()
  {
  } 
  public object Clone()
  {
   //任選一個
   return this as object;  //引用同一個對象
   //return this.MemberwiseClone(); //淺復制
   //return new DrawBase() as object;//深復制
  }
 } 
 class Program
 {
  static void Main(string[] args)
  {
   DrawBase rect = new DrawBase();
   Console.WriteLine(rect.name);
   DrawBase line = rect.Clone() as DrawBase;
   line.name = "new";
   line.listName.Add("123");
   Console.WriteLine(rect.name);
   Console.WriteLine(rect.listName.Count);
   Console.ReadLine();
  }
 }
}

當return this as object;

輸出:old,new,1

說明:方法總是引用同一個對象,因此相應的堆內(nèi)存上的值會改變

當return this.MemberwiseClone();

輸出:old,old,1

說明:對于內(nèi)部的Class的對象和數(shù)組,會Copy地址一份。[從而改變B時,A也被改變了]而對于其它內(nèi)置的int/string/Enum/struct/object類型,則進行值copy。

當return new DrawBase() as object;

輸出:old,old,0

說明:完全是創(chuàng)建一個新對象

總結(jié):

淺拷貝:是指將對象中的所有字段逐字復雜到一個新對象。

對值類型字段只是簡單的拷貝一個副本到目標對象,改變目標對象中值類型字段的值不會反映到原始對象中,因為拷貝的是副本;

對引用型字段則是指拷貝他的一個引用到目標對象。改變目標對象中引用類型字段的值它將反映到原始對象中,因為拷貝的是指向堆是上的一個地址;

深拷貝:深拷貝與淺拷貝不同的是對于引用字段的處理,深拷貝將會在新對象中創(chuàng)建一個新的對象和原始對象中對應字段相同(內(nèi)容相同)的字段,也就是說這個引用和原始對象的引用是不同, 我們改變新對象中這個字段的時候是不會影響到原始對象中對應字段的內(nèi)容。

以上這篇C# 使用Dictionary復制克隆副本及比較是否相等就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#設計模式之工廠模式

    C#設計模式之工廠模式

    本文詳細講解了C#設計模式之工廠模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C# 添加對System.Configuration.dll文件的引用操作

    C# 添加對System.Configuration.dll文件的引用操作

    這篇文章主要介紹了C# 添加對System.Configuration.dll文件的引用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C# 排序算法之堆排序

    C# 排序算法之堆排序

    這里是指一種數(shù)據(jù)結(jié)構(gòu),而不是我們在C#中提到的用于存儲引用類型對象的地方。它可以被當成一棵完全二叉樹。
    2010-09-09
  • C#獲取本機IP地址和Mac地址的方法

    C#獲取本機IP地址和Mac地址的方法

    這篇文章主要介紹了C#獲取本機IP地址和Mac地址的方法,實例分析了C#網(wǎng)絡功能的基本技巧,需要的朋友可以參考下
    2015-05-05
  • C#讀取本地網(wǎng)絡配置信息的方法小結(jié)

    C#讀取本地網(wǎng)絡配置信息的方法小結(jié)

    在現(xiàn)代軟件開發(fā)中,處理網(wǎng)絡配置信息是一個常見需求,無論是開發(fā)桌面、移動還是服務器應用程序,了解如何在C#中讀取和管理網(wǎng)絡配置信息都是非常有用的,本文將探討在C#中讀取本地網(wǎng)絡配置信息的方法,并提供幾個實際應用場景的示例,需要的朋友可以參考下
    2024-10-10
  • C#適用于like語句的SQL格式化函數(shù)

    C#適用于like語句的SQL格式化函數(shù)

    這篇文章主要介紹了C#適用于like語句的SQL格式化函數(shù),可實現(xiàn)對字符串進行sql格式化,并且符合like查詢的格式,非常實用,需要的朋友可以參考下
    2014-10-10
  • C#集合本質(zhì)之隊列的用法詳解

    C#集合本質(zhì)之隊列的用法詳解

    本文詳細講解了C#集合本質(zhì)之隊列的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • c#判斷數(shù)據(jù)庫服務器是否已經(jīng)啟動的方法

    c#判斷數(shù)據(jù)庫服務器是否已經(jīng)啟動的方法

    這篇文章主要介紹了使用c#判斷數(shù)據(jù)庫服務器是否已經(jīng)啟動的方法,大家參考使用吧
    2014-01-01
  • c#中多線程間的同步示例詳解

    c#中多線程間的同步示例詳解

    使用線程時最頭痛的就是共享資源的同步問題,處理不好會得到錯誤的結(jié)果,所以下面這篇文章主要給大家介紹了關(guān)于c#中多線程間同步的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 利用C#實現(xiàn)分割GIF圖片

    利用C#實現(xiàn)分割GIF圖片

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)分割GIF圖片的功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12

最新評論

汶川县| 华池县| 潼南县| 儋州市| 安达市| 辰溪县| 靖远县| 麻城市| 江达县| 大名县| 吴桥县| 丹阳市| 栾川县| 呈贡县| 璧山县| 静宁县| 肃南| 共和县| 防城港市| 晋宁县| 三门峡市| 宁明县| 莱州市| 漳州市| 象州县| 武城县| 陈巴尔虎旗| 嵩明县| 高安市| 淮南市| 容城县| 黄大仙区| 高淳县| 循化| 江达县| 衡南县| 乌兰浩特市| 玉树县| 广德县| 盐池县| 普兰店市|