C# Dictionary<K, V>
Dictionary<K,V>类型可定义键/值对的集合。这个类需要实例化两个类型,分别用于键和值,以表示集合中的各个项。
实例化DictionarycIQ^对象后,就可以像在继承自DictionaiyBase的类上那样,对它执行相同的操作,但要使用己有的类型安全的方法和属性。例如,使用强类型化的Add()方法添加键/值对。
Dictionary<string, int> things = new Dictionary<string, int>();
things.Add("Green Things", 29);
things.Add("Blue Things", 94);
things.Add("Yellow Things", 34);
things.Add("Red Things", 52);
things.Add("Brown Things", 27);
不使用Add()方法也可以添加键/值对,但代码看起来不是太优雅:
Dictionary<string, int> things = new Dietionary<string, int>(){
{"Green Things",29},
{"Blue Things", 94},
{"Yellow Things", 34},
{"Red Things", 52},
{"Brown Things", 27}
};
可使用Keys和Values属性迭代集合中的键和值:
foreach (string key in things.Keys)
{
WriteLine(key);
}
foreach (int value in things.Values)
{
WriteLine(value);
}
还可以迭代集合中的各个项,把每个项作为一个KeyValuePair<K,V>实例来获取,这与DictionaryEntry对象十分相似:
foreach {KeyValuePair<string, int> thing in things)
{
WriteLine($"{thing.Key} = {thing .Value}");
}
对于DictionarycK,V>要注意的一点是,每个项的键都必须是唯一的。如果要添加的项的键与已有项的键相同,就会抛出ArgumentException异常。所以,Dictionary<K,V>允许把IComparer<K>接口传递给其构造函数。 如果要把自己的类用作键,且它们不支持IComparable或IComparable<K>接口,或者要使用非默认的过程比较对象,就必须把IComparer<K>接口传递给其构造函数。例如,在上例中,可以使用不区分大小写的方法来比较 字符串键:
Dietionary<string, int> things =
new Dietionary<string, int>(StringComparer.CurrentCulturelgnoreCase);
如果使用下面的键,就会得到一个异常:
things.Add("Green Things", 29);
things.Add("Green things", 94);
也可以给构造函数传递初始容量(使用int)或项的集合(使用IDictionary<K,V>接口)。
若不使用AddO方法或更优雅的方法来填充Dictionary<K,V>类型,则可考虑使用索引初始化器,它支持在对象初始化器内部初始化索引:
var things = new Dietionary<string, int>()
{
["Green Things"] = 29,
["Blue Things"] = 94,
["Yellow Things"] = 34,
["Red Things"] = 52,
["Brown Things"] = 27
};
索引初始化器的使用很方便,因为在许多情况下都不需要通过var things显示临时变量。使用表达式体方法, 上例会级联简化的作用并使Dicticmary<K,V>类型的初始化最终变得优雅:
public Dictionary<string/ int>
SomeThings() => new Dietionary<string, int>
{ ["Green Things"] = 29, ["Blue Things"] = 94 );
点击加载更多评论>>