C# Dictionary用法总结
1、用法1: 常规用
增加键值对之前需要判断是否存在该键,如果已经存在该键而且不判断,将抛出异常。所以这样每次都要进行判断,很麻烦,在备注里使用了一个扩展方法
public?static?void?DicSample1(){
Dictionary<String,?String>?pList?=?new?Dictionary<String,?String>();
try
{
if?(pList.ContainsKey("Item1")?==?false)
{
pList.Add("Item1",?"ZheJiang");
}
if?(pList.ContainsKey("Item2")==?false)
{
pList.Add("Item2",?"ShangHai");
}
else
{
pList["Item2"]?=?"ShangHai";
}
if?(pList.ContainsKey("Item3")?==?false)
{
pList.Add("Item3",?"BeiJiang");
}
}
catch?(System.Exception?e)
{
Console.WriteLine("Error:?{0}",?e.Message);
}
//判断是否存在相应的key并显示
if?(pList.ContainsKey("Item1"))
{
Console.WriteLine("Output:?"?+?pList["Item1"]);
}
//遍历Key
foreach?(var?key?in?pList.Keys)
{
Console.WriteLine("Output?Key:?{0}",?key);
}
//遍历Value
foreach?(String?value?in?pList.Values)
{
Console.WriteLine("Output?Value:?{0}",?value);
}
//遍历Key和Value
foreach?(var?dic?in?pList)
{
Console.WriteLine("Output?Key?:?{0},?Value?:?{1}?",?dic.Key,?dic.Value);
}
}
2、用法2:Dictionary的Value为一个数组
///?<summary>///?Dictionary的Value为一个数组
///?</summary>
public?static?void?DicSample2() { Dictionary<String,?String[]>?dic?=?new?Dictionary<String,?String[]>(); String[]?ZheJiang?={?"Huzhou",?"HangZhou",?"TaiZhou"?}; String[]?ShangHai?=?{?"Budong",?"Buxi"?}; dic.Add("ZJ",?ZheJiang); dic.Add("SH",?ShangHai); Console.WriteLine("Output?:"?+?dic["ZJ"][0]); }3、用法3: Dictionary的Value为一个类
//Dictionary的Value为一个类public?static?void?DicSample3()
{ Dictionary<String,?Student>?stuList?=?new?Dictionary<String,?Student>(); Student?stu?=?null; for?(int?i?=?0;?i?<?3;?i++?) { stu?=?new?Student(); stu.Name?=?i.ToString(); stu.Name?=?"StuName"?+?i.ToString(); stuList.Add(i.ToString(),?stu); } foreach?(var?student?in?stuList) { Console.WriteLine("Output?:?Key?{0},?Num?:?{1},?Name?{2}",?student.Key,?student.Value.Name,?student.Value.Name); } }Student类:
public?class?Student
{
public?String?Num?{?get;?set;?}
public?String?Name?{?get;?set;?}
} 4 备注:Dictionary的扩展方法使用
///?<summary>///?Dictionary的扩展方法使用
///?</summary>
public?static?void?DicSample4() { //1)普通调用 Dictionary<int,?String>?dict?=?new?Dictionary<int,?String>(); DictionaryExtensionMethodClass.TryAdd(dict,?1,?"ZhangSan"); DictionaryExtensionMethodClass.TryAdd(dict,?2,?"WangWu"); DictionaryExtensionMethodClass.AddOrPeplace(dict,?3,?"WangWu"); DictionaryExtensionMethodClass.AddOrPeplace(dict,?3,?"ZhangWu"); DictionaryExtensionMethodClass.TryAdd(dict,?2,?"LiSi"); //2)TryAdd?和?AddOrReplace?这两个方法具有较强自我描述能力,用起来很省心,而且也简单: dict.AddOrPeplace(20,?"Orange"); dict.TryAdd(21,?"Banana"); dict.TryAdd(22,?"apple"); //3)像Linq或jQuery一样连起来写 dict.TryAdd(10,?"Bob") .TryAdd(11,?"Tom") .AddOrPeplace(12,?"Jom"); //4)?获取值 String?F?=?"Ba"; dict.TryGetValue(31,?out?F); Console.WriteLine("F?:?{0}",F); foreach?(var?dic?in?dict) { Console.WriteLine("Output?:?Key?:?{0},?Value?:?{1}",?dic.Key,?dic.Value); } //5)下面是使用GetValue获取值 var?v1?=?dict.GetValue(111,null); var?v2?=?dict.GetValue(10,"abc"); //6)批量添加 var?dict1?=?new?Dictionary<int,int>(); dict1.AddOrPeplace(3,?3); dict1.AddOrPeplace(5,?5); var?dict2?=?new?Dictionary<int,?int>(); dict2.AddOrPeplace(1,?1); dict2.AddOrPeplace(4,?4); dict2.AddRange(dict1,?false); }扩展方法所在的类
public?static?class?DictionaryExtensionMethodClass
{
///?<summary>
///?尝试将键和值添加到字典中:如果不存在,才添加;存在,不添加也不抛导常
///?</summary>
public?static?Dictionary<TKey,?TValue>?TryAdd<TKey,?TValue>(this?Dictionary<TKey,?TValue>?dict,?TKey?key,?TValue?value)
{
if?(dict.ContainsKey(key)?==?false)
dict.Add(key,?value);
return?dict;
}
///?<summary>
///?将键和值添加或替换到字典中:如果不存在,则添加;存在,则替换
///?</summary>
public?static?Dictionary<TKey,?TValue>?AddOrPeplace<TKey,?TValue>(this?Dictionary<TKey,?TValue>?dict,?TKey?key,?TValue?value)
{
dict[key]?=?value;
return?dict;
}
///?<summary>
///?获取与指定的键相关联的值,如果没有则返回输入的默认值
///?</summary>
public?static?TValue?GetValue<TKey,?TValue>(this?Dictionary<TKey,?TValue>?dict,?TKey?key,?TValue?defaultValue)
{
return?dict.ContainsKey(key)?dict[key]?:?defaultValue;
}
///?<summary>
///?向字典中批量添加键值对
///?</summary>
///?<param?name="replaceExisted">如果已存在,是否替换</param>
public?static?Dictionary<TKey,?TValue>?AddRange<TKey,?TValue>(this?Dictionary<TKey,?TValue>?dict,?IEnumerable<KeyValuePair<TKey,?TValue>>?values,?bool?replaceExisted)
{
foreach?(var?item?in?values)
{
if?(dict.ContainsKey(item.Key)?==?false?||?replaceExisted)
dict[item.Key]?=?item.Value;
}
return?dict;
}
}