位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# Dictionary<K, V>

提问人:刘团圆发布时间:2020-12-08

    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 );

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部