C#集合

来源:https://www.cnblogs.com/green-jcx/archive/2018/05/18/9054786.html
-Advertisement-
Play Games

一、 集合概述 沒有掌握集合的知識之前,我們通常都是用數組來存儲元素。數組有一個很明顯的特點就是,長度是固定的。假設,用數組存儲一組員工信息,顯然公司的員工數量是有流動性的,如果來了新員工,那麼以現有的知識來思考,這個數組只能重新定義。能否建立一個動態的 “數組”,使我們可以對其進行動態的操作呢?下 ...


一、 集合概述

  沒有掌握集合的知識之前,我們通常都是用數組來存儲元素。數組有一個很明顯的特點就是,長度是固定的。假設,用數組存儲一組員工信息,顯然公司的員工數量是有流動性的,如果來了新員工,那麼以現有的知識來思考,這個數組只能重新定義。能否建立一個動態的 “數組”,使我們可以對其進行動態的操作呢?下麵就引入集合,來解決這個問題。


 二、ArrayList

 ArrayList屬於非泛型集合,現在大多數情況用的很少了。文章里會首先介紹非泛型集合,是因為引出泛型集合,就像通過數組引出集合的概念一樣。

ArrayList可能會介紹的詳細一點,這都是為了後面的內容做鋪墊。

 

1.簡介

ArrayList非常類似於數組,可以填補數組的不足,進行元素的動態維護。數組的長度是固定的,而ArrayList的容量可以根據需要自動擴充,它的索引會根據程式的擴展而重新分配和調整。

ArrayList是可以動態維護的,因此在定義的時候可以指定容量,也可以不指定容量。

如圖:

 

2.給ArrayList添加數據

 a.通過Add()方法添加元素

 Add()方法是將元素添加到集合結尾處,返回一個int類型,用於返回所添加元素的索引。

重點:如果Add()添加的元素是值類型,這些元素都會裝箱處理轉換為Object引用類型。因此ArrayList中所有的元素都是引用類型。

 

b.通過集合初始化器構造集合

 

 

3.存取ArrayList中的單個元素

 ArrayList獲取一個元素的方法和數組是一樣的,也是通過索引來訪問。需要註意的是,由於元素添加時都會被轉換為object類型,所以在訪問元素的時候必須把他們轉換成原來的數據類型。

 

 

4.刪除ArrayList中的元素

4.1.RemoveAt()根據索引刪除指定元素。

使用索引刪除元素還是存在一定的風險:

運行後,發現系統異常,因為ArrayList的索引會自動分配和調整,在上圖註意事項1的集合中添加了三個元素,刪除第一個元素後,索引為“2”的第三個元素就不存在了,長度動態的發生了變化,所以再刪除索引為“2”的元素就會發生錯誤。如果存在索引為“2”的元素,那麼刪除之前和刪除之後是兩個不同的對象,這時候會導致數據不對。因此使用索引刪除元素還是存在一定的風險的。

 

4.2.Remove()指定對象刪除。

4.3.Clear()刪除集合所有元素。


 

三、Hashtable

對於ArrayList集合我們通常會使用索引訪問操作元素,但是這樣的話就存在一個問題,使用這種方式必須知道要操作的索引是多少。

Hashtable可以針對這種情況解決問題,它為每個元素都取了一個有意義並且唯一的關鍵字,然後通過關鍵字來訪問元素。

Hashtable,通常稱為哈希表,也有人稱它為“字典”。使用字典這個名詞,是因為其數成非常類似於現實生活中的字典。Hashtable的數據是通過(key)鍵和值(value)來組織的。

如圖:

1.添加元素:

Add(key,value)

 

2.獲取Hashtable元素

2.1.和ArrayList不同,訪問Hashtable元素時只能使用通過鍵名來獲取具值。

如圖:

用索引訪問,程式運行時會提示“未將對象引用設置到對象的示例”。

 

2.2.由於添加時值被隱試轉換為object類型,所以當從集合中獲取元素時要通過類型轉換得到指定類型對象。

示例:

 

2.3.刪除Hashtable的元素:

通過鍵(key),使用Remove()方法就可以刪除。

 

2.4.遍歷Hashtable中的元素

由於Hashtable不能使用索引訪問,所以遍歷一個Hashtable只能用foreach()方法:

遍歷Hashtable中的對象:


四、泛型集合

前面介紹了兩種非泛型集合,Hashtable和ArrayList。在實際開發過程中,用的很少了,說明這兩個集合也是為了對講解和學習泛型集合有一個好的鋪墊。

非泛型集合對元素的數據類型沒有約束性,在添加時數據類型都會被轉為Object類型,這意味著集合中可以加入不同的數據類型的數據。那麼這樣對數據的操作會有什麼影響呢?

示例:

在添加的時候沒有約束類型,讀取的時候也不知道對象的具體的類型,所以在元素數據類型轉換的時候就存在了不確定性。有沒有什麼好的方法限制集合中元素的數據類型呢?下麵就來介紹使用泛型集合來保存數據。泛型集合限定了集合中的數據類型。

 

1.泛型集合List<T>

1.1.語法:List<T> 對象名 = new List<T>();

“<T>”需要指定一個數據類型,將T替換換指定數據類型後就可以對集合中的元素的數據類型進行約束。

 

1.2.泛型集合List<T>添加、獲取、刪除元素以及遍歷的方法和ArrayList的用法都是類似的。但是List<T>在遍歷訪問元素時無需做類型轉換。

示例:

 

1.3.List<T>與ArrayList的區別

 

2.泛型集合Dictionary<K,V>

Dictionary<K,V>集合類似於前面所講的Hashtable,也是通過Key/value(鍵/值)對元素保存的。

它具有泛型的全部特性,編譯時檢查類型約束,獲取元素時只能通過key而不能通過索引,並且獲取元素時無需類型轉換。

 

2.1.語法:

Dictionary<K,V> 對項目 = new Dictionary<K,V>();

說明:K表示集合中指定Key的類型,V表示Value的類型。他們的含義和List<T>是相同的。

 

2.2.Dictionary<K,V>集合的常用(添加、刪、獲取)操作方法和Hashtable是一樣的,在這裡不詳細介紹。

示例:

 

2.3.遍歷Dictionary<K,V>集合:

KeyValuePair<Tkey,Tvalue>是一個泛型結構,定義可設置或者檢索的鍵/值對。詳細內容可以查閱MSDN。

 

2.4.Dictionary<K,V>和Hashtable的對比:


 

 

總結:本文只是對集合做了基礎和細節的介紹,集合在開發中通常用來存儲對象,而在實際的開發中還要結合實際功能深入去學習怎麼去運用才是關鍵。

 

 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 小程式頁面代碼因為某些人力不可控的原因代碼丟失了,這裡簡單說明一下 調用小程式APIwx.chooseImage(OBJECT)選擇相冊或拍攝照片,會返回 tempFilePaths,之後通過wx.uploadFile(OBJECT)把照片傳至後臺,在伺服器後臺進行Base64編碼, 小程式目前不支 ...
  • 找了好多都有問題,這個可以分享給到家 轉自:https://www.cnblogs.com/kmust/p/4412228.html ...
  • 本文的重點主要是解決:List<T>對象集合的排序功能。 一、List<T>.Sort 方法 () MSDN對這個無參Sort()方法的介紹:使用預設比較器對整個List<T>中的元素進行排序。 從官方文檔的介紹,很難的看出詳細的解析,而且還要完整的知識結構去分析,上面提到了一個關鍵詞:比較器。大致 ...
  • 20180518更新內容 1、重構調整QQ登錄代碼,使用JObject,減少代碼,增加access_token自動續期(未測試)。 2、重構調整微信登錄代碼,使用JObject,減少代碼,增加access_token自動續期(未測試)。 3、重構微信公眾號登錄接入代碼,使用JObject,減少代碼。 ...
  • 編譯環境需求(3239版本) win7或更高,64位 vs2017 15.3.2+ 預設位置安裝 不需要安裝附帶的win10sdk,sdk單獨裝 Windows 10.0.15063.468 SDK 預設位置安裝 這裡下載相應版本sdk 8g ram 和 40g disk 實測完全不夠,最終編譯成功 ...
  • 在我們使用WPF過程中,不可避免並且超級喜歡使用MVVM框架。 那麼,使用MVVM的出發點是視覺與業務邏輯分離,即UI與數據分離 諸如下麵的問題: 刪除操作,假如需要先執行一部分數據的處理,然後刪除界面列表中的子項,之後再執行其它數據的處理。請問此業務該放置於Xaml.cs文件,還是ViewMode ...
  • 回到目錄 Monitor的介紹 1.Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個方法,當然在使用過程中為了避免獲取鎖之後因為異常,致鎖無法釋放,所以需要在try{} catch(){}之後的finall ...
  • 工作上和另一個公司對接,調對方的api需要用到md5加密,加密前要使用HttpUtility.UrlEncode,對方介面一直返回驗證錯誤,定位了問題發現是中文編碼使用HttpUtility.UrlEncode導致的。 C#中HttpUtility.UrlEncode返回的url編碼是小寫的,但對方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...