LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#中Dictionary的用法(取值/新增/編輯/刪除/排序)及用途【Good!】

admin
2021年3月5日 11:35 本文熱度 4909
Dictionary是一個泛型,他本身有集合的功能有時候可以把它看成數(shù)組,他的結(jié)構(gòu)是這樣的:
Dictionary<[key], [value]>
他的特點是存入對象是需要與[key]值一一對應(yīng)的存入該泛型,通過某一個一定的[key]去找到對應(yīng)的值。舉個例子:
//實例化對象
Dictionary<int,string>dic=new Dictionary<int,string>();

//元素添加,要確保key還沒有,否則會報錯
dic.Add(1, "one");
dic.Add(2, "two");
dic.Add(3, "one");
//另外一種元素添加方法,無需判斷key是否存在,無則新增,有則更新
dic[1]="one";
dic[2]="two";
dic[3]="one";

//提取元素的方法
string a = dic[1];
string b = dic[2];
string c = dic[3];
//1、2、3是鍵,分別對應(yīng)“one”“two”“one”
//上面代碼中分別把值賦給了a,b,c
//注意,鍵相當(dāng)于找到對應(yīng)值的唯一標(biāo)識,所以不能重復(fù)
//但是值可以重復(fù)

//更新元素,其實和上面的新增是同一個,無需判斷key是否存在,無則新增,有則更新
dic[1]="one";
dic[2]="two";
dic[3]="one";

更詳細(xì)用法以 key 的類型為 int,value 的類型為 string 為例:
//創(chuàng)建及初始化
Dictionary<int,string>myDictionary=new Dictionary<int,string>();

//添加元素,要確保key還沒有,否則會報錯
myDictionary.Add(1,"C#");
myDictionary.Add(2,"C++");
myDictionary.Add(3,"ASP.NET");
myDictionary.Add(4,"MVC");
//另外一種元素添加方法,無需判斷key是否存在,無則新增,有則更新
myDictionary[1]="C#";
myDictionary[2]="C++";
myDictionary[3]="ASP.NET";
myDictionary[4]="MVC";

//通過Key查找元素
if(myDictionary.ContainsKey(1))
{
      Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);
}

//通過KeyValuePair遍歷元素
foreach(KeyValuePair kvp in myDictionary)
{
   Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value);
}

//僅遍歷鍵 Keys 屬性
Dictionary.KeyCollection keyCol=myDictionary.Keys;
foreach(int key in keyCol)
{
    Console.WriteLine("Key = {0}", key);
}

//僅遍歷值 Valus屬性
Dictionary.ValueCollection valueCol=myDictionary.Values;
foreach(string value in valueCol)
{
     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");
}

//遍歷key

foreach (string key in openWith.Keys)

{

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

}


//遍歷value

foreach (string value in openWith.Values)

{

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

}

 

//遍歷value, Second Method

Dictionary<string, string>.ValueCollection valueColl = openWith.Values;

foreach (string s in valueColl)

{

    Console.WriteLine("Second Method, Value = {0}", s);

}


//遍歷字典

foreach (KeyValuePair<string, string> kvp in openWith)

{

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

}


//判斷鍵存在

if (openWith.ContainsKey("bmp")) // True

{

    Console.WriteLine("An element with Key = \"bmp\" exists.");

}


參數(shù)為其他類型:

//參數(shù)為其它類型

Dictionary<int, string[]> OtherType = new Dictionary<int, string[]>();

OtherType.Add(1, "1,11,111".Split(','));

OtherType.Add(2, "2,22,222".Split(','));

Console.WriteLine(OtherType[1][2]);


幾條建議:
1、給Dictionary添加元素時,建議直接用中括號的方式,而不是使用Add方法。
任何鍵key都必須是唯一的,不能添加相同key的鍵值,不然就會報錯。雖然不管是用[]還是Add方法,調(diào)用的都是Dictionary的Insert函數(shù),但是區(qū)別在于用Add函數(shù)的話,如果已經(jīng)存在同樣的鍵對值,會直接拋出ArgumentException,這意味著后續(xù)的代碼都不執(zhí)行了,這可很要命,明明是一個小問題,可看上去可能是一個大Bug。而用中括號屬性的方法,如果不存在會添加,如果存在則進行改寫,只要key值不為null,是不會拋出異常的。

2、利用TryGetValue(TKey key, out TValue value)接口獲取Dictionary中的數(shù)據(jù)。
法一:ContainsKey(key) 方法:
if(myDictionary.ContainsKey(key))
{
    // 通過key索引value
    int resValue = myDictionary[key];
}
法二:TryGetValue方法:
int resValue ;
myDictionary.TryGetValue(key, out resValue);
根據(jù)key取value,最好使用 TryGetValue 而不是 ContainsKey+ 根據(jù)key索引value。使用TryGetValue更快,性能更好,因為只用了一次查找,TryGetValue 比 ContainsKey 后使用[key]取value,速度快一倍。TryGetValue更安全,找不到value時返回false;而使用ContainsKey后使用[key]取value取不到時,會拋出異常導(dǎo)致真機卡死。
string GetDictionaryVal(string strkey)
{
    if (!dicTest.ContainsKey(strkey))
    {
        return string.Empty;
    }

    return dicTest[strkey];
}
上面這段代碼其實非常正確,但是從效率的角度上看卻對dictionary進行兩遍的查找:ContainsKey和下標(biāo)操作各一次。所以我們可以這么寫:
string GetDictionaryVal(string strkey)
{
    string strVal = string.Empty;
    dicTest.TryGetValue(strkey, out strVal);
    return strVal;
}
TryGetValue函數(shù)的返回值為bool值,表示是否存在于Dictionary中。


如果你還看不懂我最后給你舉一個通俗的例子:
有一缸米,你想在在每一粒上都刻上標(biāo)記,不重復(fù),相當(dāng)于“鍵”當(dāng)你找的時候一一對應(yīng)不會找錯,這就是這個泛型的鍵的-作用,而米可以一樣,我的意思你明白了吧?

  • 常用屬性

  • 名稱說明
    Comparer獲取用于確定字典中的鍵是否相等的 IEqualityComparer<T>。
    Count獲取包含在 Dictionary<TKey, TValue> 中的鍵/值對的數(shù)目
    Item獲取或設(shè)置與指定的鍵相關(guān)聯(lián)的值。
    Keys 獲取包含 Dictionary<TKey, TValue> 中的鍵的集合。
    Values 獲取包含 Dictionary<TKey, TValue> 中的值的集合。
  • 常用方法

名稱說明
Add  將指定的鍵和值添加到字典中。
Clear從 Dictionary<TKey, TValue> 中移除所有的鍵和值
ContainsKey  確定 Dictionary<TKey, TValue> 是否包含指定的鍵
ContainsValue  確定 Dictionary<TKey, TValue> 是否包含特定值
GetEnumerator返回循環(huán)訪問 Dictionary<TKey, TValue> 的枚舉器
GetObjectData實現(xiàn) System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary<TKey, TValue> 實例所需的數(shù)據(jù)
GetType獲取當(dāng)前實例的 Type。 (繼承自 Object。)
MemberwiseClone創(chuàng)建當(dāng)前 Object 的淺表副本。 (繼承自 Object。)
OnDeserialization實現(xiàn) System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引發(fā)反序列化事件。
Remove從 Dictionary<TKey, TValue> 中移除所指定的鍵的值 TryGetValue 獲取與指定的鍵相關(guān)聯(lián)的值。
Equals(Object) 確定指定的 Object 是否等于當(dāng)前的 Object。 (繼承自 Object。
Finalize允許對象在“垃圾回收”回收之前嘗試釋放資源并執(zhí)行其他清理操作。(繼承自 Object。)
GetHashCode用作特定類型的哈希函數(shù)。 (繼承自 Object。)
-------------------------------------------------------------------------

c# 對dictionary類進行排序用什么接口實現(xiàn)

如果使用.Net Framework 3.5的話,事情就很簡單了。呵呵。
如果不是的話,還是自己寫排序吧。

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace DictionarySorting    //排序,通過KeyValuePair遍歷元素
{
class Program
{
static void Main(string[] args)
{
Dictionary<int,string>dic=new Dictionary<int,string>();
dic.Add(1, "HaHa");
dic.Add(5, "HoHo");
dic.Add(3, "HeHe");
dic.Add(2, "HiHi");
dic.Add(4, "HuHu");
var result = from pair in dic orderby pair.Key select pair;    //關(guān)鍵在本行
foreach (KeyValuePair pair in result)
{
Console.WriteLine("Key:{0}, Value:{1}", pair.Key, pair.Value);
}
Console.ReadKey();
}
}
}

【執(zhí)行結(jié)果】
Key:1, Value:HaHa
Key:2, Value:HiHi
Key:3, Value:HeHe
Key:4, Value:HuHu
Key:5, Value:HoHo

Dictionary的基本用法。假如:
需求:現(xiàn)在要導(dǎo)入一批數(shù)據(jù),這些數(shù)據(jù)中有一個稱為公司的字段是我們數(shù)據(jù)庫里已經(jīng)存在了的,目前我們需要把每個公司名字轉(zhuǎn)為ID后才存入數(shù)據(jù)庫。
分析:每導(dǎo)一筆記錄的時候,就把要把公司的名字轉(zhuǎn)為公司的ID,這個不應(yīng)該每次都查詢一下數(shù)據(jù)庫的,因為這太耗數(shù)據(jù)庫的性能了。
解決方案:在業(yè)務(wù)層里先把所有的公司名稱及相應(yīng)的公司ID一次性讀取出來,然后存放到一個Key和Value的鍵值對里,然后實現(xiàn)只要把一個公司的名字傳進去,就可以得到此公司相應(yīng)的公司ID,就像查字典一樣。對,我們可以使用字典Dictionary操作這些數(shù)據(jù)。
示例:SetKeyValue()方法相應(yīng)于從數(shù)據(jù)庫里讀取到了公司信息。

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

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

該文章在 2021/3/5 16:10:33 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
日本人妖资源站在线观看 | 日韩亚洲欧美中文字幕影音 | 亚洲精品萝福利莉在线 | 亚洲欧美另类在线一区二区三区 | 亚洲国产91一区二区 | 最新AV免费在线观看 |