C# Dictionary 泛型

来源:https://www.cnblogs.com/zjicmhahah/archive/2018/07/30/9389613.html
-Advertisement-
Play Games

Dictionary<string, string>是一個泛型,什麼是泛型?使用泛型下麵是用泛型來重寫上面的棧,用一個通用的數據類型T來作為一個占位符,等待在實例化時用一個實際的類型來代替。讓我們來看看泛型的威力: public class Stack<T> { private T[] m_item ...


Dictionary<string, string>是一個泛型,什麼是泛型?


使用泛型
下麵是用泛型來重寫上面的棧,用一個通用的數據類型T來作為一個占位符,等待在實例化時用一個實際的類型來代替。讓我們來看看泛型的威力:




public class Stack<T>

    {

        private T[] m_item;

        public T Pop(){...}

        public void Push(T item){...}

        public Stack(int i)

        {

            this.m_item = new T[i];

        }

}

 



這個類和object實現的類有截然不同的區別:

1.       他是類型安全的。實例化了int類型的棧,就不能處理string類型的數據,其他數據類型也一樣。

2.       無需裝箱和折箱。這個類在實例化時,按照所傳入的數據類型生成本地代碼,本地代碼數據類型已確定,所以無需裝箱和折箱。

3.       無需類型轉換。

 

 

 

 

他的結構是這樣的:Dictionary<[key], [value]>

 

他的特點是存入對象是需要與[key]值一一對應的存入該泛型

 

通過某一個一定的[key]去找到對應的值

 

舉個例子:

 

//實例化對象

Dictionary<int, string> dic = new Dictionary<int, string>();

//對象打點添加

dic.Add(1, "one");

dic.Add(2, "two");

dic.Add(3, "one");

//提取元素的方法

string a = dic[1];

string b = dic[2];

string c = dic[3];

//通過Key查找元素

if(myDictionary.ContainsKey(1))

{

Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);

 }

//通過KeyValuePair遍歷元素

foreach(KeyValuePair<int,string>kvp in myDictionary)

{

Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value);

}

//僅遍歷鍵 Keys 屬性

Dictionary<int,string>.KeyCollection keyCol=myDictionary.Keys;

foreach(intkeyinkeyCol)

{

Console.WriteLine("Key = {0}", key);

}

//僅遍歷值 Valus屬性

Dictionary<int,string>.ValueCollection valueCol=myDictionary.Values;

foreach(stringvalueinvalueCol)

{

Console.WriteLine("Value = {0}", value);

}

//通過Remove方法移除指定的鍵值

myDictionary.Remove(1);

if(myDictionary.ContainsKey(1))

{

  Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);

}

else

{

Console.WriteLine("不存在 Key : 1"); 

 }

 

其它常見屬性和方法的說明:
Comparer: 獲取用於確定字典中的鍵是否相等的 IEqualityComparer。 Count: 獲取包含在 Dictionary中的鍵/值對的數目。 Item: 獲取或設置與指定的鍵相關聯的值。 Keys: 獲取包含 Dictionary中的鍵的集合。 Values: 獲取包含 Dictionary中的值的集合。 Add: 將指定的鍵和值添加到字典中。 Clear: 從 Dictionary中移除所有的鍵和值。 ContainsKey: 確定 Dictionary是否包含指定的鍵。 ContainsValue: 確定 Dictionary是否包含特定值。 GetEnumerator: 返回迴圈訪問 Dictionary的枚舉數。 GetType: 獲取當前實例的 Type。 (從 Object 繼承。) Remove: 從 Dictionary中移除所指定的鍵的值。 ToString: 返回表示當前 Object的 String。 (從 Object 繼承。) TryGetValue: 獲取與指定的鍵相關聯的值。

  





Dictionary的基本用法。假如

需求:現在要導入一批數據,這些數據中有一個稱為公司的欄位是我們資料庫里已經存在了的,目前我們需要把每個公司名字轉為ID後才存入資料庫。

分析:每導一筆記錄的時候,就把要把公司的名字轉為公司的ID,這個不應該每次都查詢一下資料庫的,因為這太耗資料庫的性能了。

解決方案:在業務層里先把所有的公司名稱及相應的公司ID一次性讀取出來,然後存放到一個Key和Value的鍵值對里,然後實現只要把一個公司的名字傳進去,就可以得到此公司相應的公司ID,就像查字典一樣。對,我們可以使用字典Dictionary操作這些數據。

示例:SetKeyValue()方法相應於從資料庫里讀取到了公司信息。

 

/// <summary>
/// 定義Key為string類型,Value為int類型的一個Dictionary
/// </summary>
/// <returns></returns>
protected Dictionary<string, int> SetKeyValue()
{
Dictionary<string, int> dic = new Dictionary<string, int>();
dic.Add("公司1", 1);
dic.Add("公司2", 2);
dic.Add("公司3", 3);
dic.Add("公司4", 4);
return dic;
}


/// <summary>
/// 得到根據指定的Key行到Value
/// </summary>
protected void GetKeyValue()
{
Dictionary<string, int> myDictionary = SetKeyValue();
//測試得到公司2的值
int directorValue = myDictionary["公司2"];
Response.Write("公司2的value是:" + directorValue.ToString());
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 記錄一下,方便以後用。。。感覺計算這些亂七八糟的還是有點難的,,,也許是自己還不太熟。。 ...
  • Topshelf 學習 跨平臺 Topshelf是一個開源的跨平臺的宿主服務框架,支持Windows和Mono,只需要幾行代碼就可以構建一個很方便使用的服務宿主。 官網:http://topshelf-project.com GitHub:http://github.com/topshelf/Top ...
  • 使用Common.Logging+log4net規範日誌管理 Common.Logging+(log4net/NLog/) common logging是一個通用日誌介面,log4net是一個強大的具體實現,也可以用其它不同的實現,如EntLib的日誌、NLog等。 Common.Logging可以 ...
  • 最近在做mvc跨控制器傳值的時候發現一個問題,就是有時候TempData的值為null,然後查閱了許多資料,發現了許多都是邏輯什麼的,但是真正解決的辦法什麼的都沒有案例, 於是就把自己的代碼當成案例給貼出來,方便更直觀的解決問題。 因為TempData生命周期確實很短,所以需要持久化一下: 在當前A ...
  • 1、介紹 Logging組件是微軟實現的日誌記錄組件包括控制台(Console)、調試(Debug)、事件日誌(EventLog)和TraceSource,但是沒有實現最常用用的文件記錄日誌功能(可以用其他第三方的如NLog、Log4Net。之前寫過NLog使用的文章)。 2、預設配置 新建.Net ...
  • [TOC] 一、前言 本教程是入門基礎教程,主要是筆者在項目中使用MongoDB .Net官方驅動對MongoDB內嵌文檔的操作時遇到了很多不方便的情況,踩了很多的坑,所以單獨整理出來一篇文章,來講一講筆者踩坑的過程。 筆者水平有限,如有錯誤還請批評指正! (一) 運行環境 .net版本 .Net ...
  • [TOC] 因項目需要,對於部分控制器需要實現偽靜態方便搜索引擎優化(SEO),過程比較曲折,簡單的記錄一下。 1.什麼是偽靜態?為什麼要實現偽靜態? 偽靜態:動態網頁通過重寫URL的方法實現去掉動態網頁的參數,但在實際的網頁目錄中並沒有必要實現存在重寫的頁面。 例如:我們當訪問地址http://w ...
  • [TOC] 一、 前言 這是筆者在參與一個小型項目開發時所遇到的一個BUG,因為項目經驗不足對Entity Framwork框架認識不足導致了這一BUG浪費了一天的時間,特此在這裡記錄。給自己一個警醒希望大家遇到相同問題能幫助到大家。 註:筆者水平有限,大家發現錯誤望批評指正。 二、問題背景 1.本 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...