C# - 泛型集合List与Dictionary,两者的差异,装箱,拆箱 092

泛型集合的声明格式

泛型集合List与Dictionary位于System.Collections.Generic;命名空间下

//泛型List
List<T> list =new List<T>();
//声明一个int类型的集合(T 就被 int 代替)
List<int> list =new List<int>();
List 表示泛型集合
List<int> 表示当前集合的类型(只能添加int类型的元素)
T 用于约束集合中元素的数据类型,可以说是Type的简写
  可以使用任何字母代替如 X,h1,yT等等

//泛型Dictionary
Dictionary<K, V> dict = new Dictionary<K, V>();
//K,V 相当于 Key Value的简写
//K,V与上面的T作用一样,也可以看做是输出中的占位符
//声明一个键是int类型,值是string类型的集合
Dictionary<int, string> dict = new Dictionary<int, string>();

注意事项:

1)集合等号两侧<>中对应位置的数据类型必须一样;类型可以是简单的如int,string,bool等,也可以是复杂的如枚举,结构,类等,看具体需要将具体类型替换T/K/V这些"占位符"

2)一旦确定了集合的类型,只能添加对应的数据类型(相容与强制转换的都可以)

注意事项 1 (VS有提示,无法通过编译)
声明时的错误
List<int> list =new List<string>();
前面是 int,string  后面变成了  int,int 
Dictionary<int, string> dict = new Dictionary<int, int>();

添加元素时的错误
List<int> list =new List<int>();
list.Add("1");//添加了字符串类型的元素
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add("1",0);
dict.Add("1","0");
dict.Add(1,0);
......
添加元素时会有对应位置的类型提示

上面行号12的代码不止类型对应的元素弄错,键也重复了,会报异常(添加了重复的键)

两种泛型集合的具体属性与方法不再一一列举声明(都有提示)

注意:ToArray()方法,List集合是什么类型就用什么类型的集合接收
List<int> list =new List<int>();
int类型集合用 int类型数组接收
int[] nums=list.ToArray();
List<string> list =new List<string>();
string[] strs=list.ToArray();
其他接收类型以此类推

泛型集合的List与Dictionary可以说是非泛型集合ArrayList与Hashtable的"升级"版

主要区别在于:

1)非泛型集合(前者)存储数据方便(都是object)泛型集合(后者)存储的是固定类型的数据

2)前者使用时不方便(会发生装箱,拆箱操作,影响性能)后者可以使用指定类型接收集合中的元素,安全且高效

前者可以说是强类型(只能存储同一类型数据)后者是弱类型(可以存储任意类型数据)

装箱,拆箱:暂时理解为将集合的元素进行值类型与引用类型相互转换(频繁操作内存)使用非泛型类型的数据时最易发生装箱,拆箱操作

3)泛型集合是有序集合即读取元素时按存储的顺序取出

声明与使用

static void Main(string[] args)
{
    #region List
    //简单数据类型
    List<int> list = new List<int>();
    //复杂数据类型
    //此时的Person类可以看做是实体类
    List<Person> listP = new List<Person>();
    Person p1 = new Person();
    p1.Name = "张三";
    p1.Age = 18;
    listP.Add(p1);
    Person p2 = new Person() { Name = "李四", Age = 19 };
    listP.Add(p2);
    //新方式,不要接收变量
    listP.Add(new Person() { Name = "王五", Age = 20 });
    //遍历输出
    foreach (Person p in listP)
    {
        Console.WriteLine("姓名 {0}  年龄 {1}", p.Name, p.Age);
    }
    Console.WriteLine("");
    //===========================================
    //只为演示泛型键值对集合的应用
    Dictionary<int, Hot> dict = new Dictionary<int, Hot>();
    dict.Add(1, new Hot() { HTitle = "新版字典删除\"倭寇\"", TContent = "近日,有网友称,新版《新华字典》中将\"倭寇\"一词删除引发关注;27日,记者在新华书店探访发现,第12版《新华字典》确实没有了\"倭寇\"一词,出版社回应称,他们已知晓此事,有关单位正在\"调查\"中..." });
    dict.Add(2, new Hot() { HTitle = "托关系进普高被骗无法高考", TContent = "近日,武汉的董女士向《经视直播》反映,她女儿在武汉市汉南第一中学借读三年,在报名今年高考时,却发现女儿竟然没有普高学籍,无法参加高考,原因在于三年前托关系花费12万给中间人,却无学籍因而无法高考,详细情况,有关部分正在\"办理\"中..." });
    dict.Add(3, new Hot() { HTitle = "315曝光苦情戏直播带货", TContent = "揭露的消费黑幕中,直播间里\"苦情戏\"让不少老人沉迷其中;这类主播装出一副正义凛然的样子帮助解决纠纷,无一例外都能机缘巧合得到号称能治疗疾病的产品,并且卖给观看直播的老人们,但其实都是普通食品;有网友对直播平台提出质疑,也有网友建议\"重罚直播平台\",还有网友认为直播账号\"封了又开\"不能彻底解决问题..." });
    //遍历输出键
    foreach (int key in dict.Keys)
    {
        Console.WriteLine(key);
    }
    //遍历输出值
    foreach (Hot h in dict.Values)
    {
        Console.WriteLine("事件名称 {0}  事件内容 {1}", h.HTitle, h.TContent);
    }
    //同时遍历键,值
    foreach (KeyValuePair<int, Hot> item in dict)
    {
        //值输出的是完全限定名称(命名空间.类名)
        //可以进行重写(昨天说过)
        Console.WriteLine("键: {0}  值: {1}", item.Key, item.Value);
    }
    #endregion
    Console.ReadKey();
}
//引用的类
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }    
}
public class Hot
{
    public string HTitle { get; set; }
    public string TContent { get; set; }
}

泛型集合的声明与使用

List与Dictionary都类似一个容器

Dictionary<K,V>是一个关联数组或地图,是一个可以通过任何类型的值索引的容器

List是一个整数索引数组,是一个可以通过索引的容器

因此,本质上的区别:1)容器的索引方式 2)List的索引是连续的,而Dictionary<int,T>的索引可能存在间隙

举报
评论 0