using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Generic;
/*
* 泛型就常见的用途是泛型集合,命空间System.Collections.Generic中包含了解一些基于泛型的集合类,使用泛型集合类,可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱.
* 很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
*
* 非泛型集合类 泛型集合类
* ArrayList List<T>
* HashTable DIctionary<T>
* Queue Queue<T>
* Stack Stack<T>
* SortedList SortedList<T>
*
* 我们用的比较多的非泛型集合类主要有ArrayList类和HashTable类. 我们经常用HashTable来存储要写入到数据库或者返回的信息,在这之间要不断的进行了类型的转化,增加了系统装箱和拆箱的负担,
* 如果说我们操纵的数据类型相对确定的化, 用Dictionary<TKey, TValue>集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户服务的购物车信息(商品名,对应的商品个数)时,完全
* 用Dictionary<string,int>来存储购物车信息,而不需要任何的类型转化.
* */
namespace 集合类_六__Dictionary_泛型集合
{
/// <summary>
/// 包括声明,填充键值对,移除键值对,遍历键值对
/// </summary>
class Program
{
public void DictionaryTest()
{
Dictionary<string, string> myDic = new Dictionary<string, string>();
myDic.Add("aaa", "111");
myDic.Add("bbb", "222");
myDic.Add("ccc", "333");
myDic.Add("ddd", "444");
//如果添加已存在的键,add方法会抛出异常
try
{
myDic.Add("ddd", "ddd");
}
catch (Exception ex)
{
Console.WriteLine("此键已经存在: " + ex.Message);
}
//解决add()异常的方法是用ContainsKey()方法来判断键是否存在
if (!myDic.ContainsKey("ddd"))
{
myDic.Add("ddd", "ddd");
}
else
{
Console.WriteLine("此键已经存在: ");
}
//解决add()异常的方法是用ContainsValue(0方法来判断键是否存在
if (!myDic.ContainsValue("ddd", "ddd"))
{
myDic.Add("ddd", "ddd");
}
else
{
Console.WriteLine("此键已经存在: ");
}
//而使用索引器来负值时,如果键已经存在,就会修改已有的键的键值,而不会抛出异常
myDic["ddd"] = "ddd";
myDic["eee"] = "555";
//使用索引器来取值时,如果键不存在就会引发异常
try
{
Console.WriteLine("不存在的键的键为:" + myDic["fff"]);
}
catch (KeyNotFoundException ex)
{
Console.WriteLine("没有找一键引发异常:" + ex.Message);
}
//解决上面的异常的方法是使用ContarnsKey()来判断时候存在键,如果经常要取健值得话最好用TryGetValue方法来获取集合中的对应键值
string value = "";
if (myDic.TryGetValue("fff", out value))
{
Console.WriteLine("不存在的键的键值为: " + value);
}
else
{
Console.WriteLine("没有找到对应键的键值");
}
//下面用foreach来遍历键值对
//泛型结构体,用来存储键值对
foreach (KeyValuePair<string, string> kvp in myDic)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
//获取值得集合
foreach (string s in myDic.Values)
{
Console.WriteLine("value={0}", s);
}
//获取值的另一种方式
Dictionary<string, string>.ValueCollection values = myDic.Values;
foreach (string s in values)
{
Console.WriteLine("value ={0}", s);
}
}
static void Main(string[] args)
{
}
}
}
/*
* 常用属性 属性说明
* Comparer 获取用于确定字典中的键是否相等的 IEqualityComparer
* Count 获取包含在Dictionary中的键/值对的数目
* Item 获取或设置与指定键相关联的值.
* Keys 获取包含Dictionary中的键的集合
* Values 获取包含Dictionary中的值的集合
*
* 使用方法 方法说明
* Add 将指定的键和值添加到字典中
* Clear 从Dictionary中移除所有的键和值
* ContainsKey 确定Dictionary是否包含指定的键
* ContainsValue 确定Dictionary是否包含特定值
* Equals 已重载.确定两个Object实例是否相等. (从Object 继承)
* GetEnumerator 返回循环访问期间Dictionary的枚兴数
* GetHashCode 用作特定类型的哈希表函数,GetHashCode适合在哈希算法和数据结构(如哈希表)中使用.(从Object继承)
* GetObjectData 实现 System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary 实例所需的数据。
* GetType 获取当前实例的 Type。 (从 Object 继承。)
* OnDeserialization 实现 System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引发反序列化事件。
* ReferenceEquals 确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)
* Remove 从 Dictionary 中移除所指定的键的值。
* ToString 返回表示当前 Object 的 String。 (从 Object 继承。)
* TryGetValue 获取与指定的键相关联的值。
* */
案例分析:
问题:存储城市信息,选择某个城市,相应的城市的区号、邮编、城市等级也显示出来
分析:要存储城市的信息没有合适的数据类型允许这样做,这时可以考虑用Hashtable类,我们可以将城市的名称作为键来引用,而将区号、邮编、城市等级作为值来引用。那我们是用一般集合,还是用泛型集合呢,推荐用泛型集合。因为它优点多多,见前面说的优点
namespace test
{
public class CityInfo
{
private string m_name="";
public string Name
{
get{return m_name;}
set{m_name = value;}
}
private string m_code="";
public string Code
{
get{return m_code;}
set{m_code = value;}
}
}
class Program
{
static void Main(string[] args)
{
Dictionary<string, CityInfo> arr = new Dictionary<string, CityInfo>();
//城市信息,包括名称、区号、邮编、城市等级这几个属性
CityInfo ci = new CityInfo();
ci.Name = "成都";//从文本框读取的数据存入对应的城市信息
ci.Code = "028";
arr.Add("成都", ci);
foreach (KeyValuePair<string, CityInfo> kvp in arr)
{
Console.WriteLine(kvp.Value.Code + kvp.Value.Name);
}
Console.Read();
}
}
}