C# Dictionary用法总结
1、用法1: 常规用
增加键值对之前需要判断是否存在该键,如果已经存在该键而且不判断,将抛出异常。所以这样每次都要进行判断,很麻烦,在备注里使用了一个扩展方法
public
static
void
DicSample1()
{
Dictionary
new
Dictionary
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为一个数组
///
/// Dictionary的Value为一个数组
///
public
static
void
DicSample2()
{
Dictionary
new
Dictionary
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
new
Dictionary
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的扩展方法使用
///
/// Dictionary的扩展方法使用
///
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
{
///
/// 尝试将键和值添加到字典中:如果不存在,才添加;存在,不添加也不抛导常
///
public
static
Dictionary
this
Dictionary
{
if
(dict.ContainsKey(key) ==
false
)
dict.Add(key, value);
return
dict;
}
///
/// 将键和值添加或替换到字典中:如果不存在,则添加;存在,则替换
///
public
static
Dictionary
this
Dictionary
{
dict[key] = value;
return
dict;
}
///
/// 获取与指定的键相关联的值,如果没有则返回输入的默认值
///
public
static
TValue GetValue
this
Dictionary
{
return
dict.ContainsKey(key)?dict[key] : defaultValue;
}
///
/// 向字典中批量添加键值对
///
/// 如果已存在,是否替换
public
static
Dictionary
this
Dictionary
bool
replaceExisted)
{
foreach
(
var
item
in
values)
{
if
(dict.ContainsKey(item.Key) ==
false
|| replaceExisted)
dict[item.Key] = item.Value;
}
return
dict;
}
}
|
参考资料