.Net学习 第2季05 C#面向对象 ArrayList Hashtable List<> Dictionary<>
.Net 视频学习第2季 C#面向对象
面向对象 ArrayList Hashtable List<>
数组:类型单一(除非是父类数组,子类对象作元素---注意元素还是被认为是父类对象!),长度固定
int[] a = new int[10];
集合:命名空间System.Collections
ArrayList list = new ArrayList();
往集合里边添加数据
list.Add(1);
对同一个集合,可以往里边添加任意类型的数据。(注意Add()方法的输入参数是object类,是所有类型的基类)
ArrayList没有Length属性,不过有Count属性,本质一样。
int a =list.Count;
从上边可以看出集合至少比数组在两方面有优势,第一是不用考虑元素类型是否一致,第二是不用考虑长度问题。
再次强调一点,Add()放进集合的元素都会被视作object类的对象,而不是元素本身的类的对象!!
(放数据很爽,用数据很苦逼————要数据类型转换)
往集合添加数据(集合类型)的另一个方法:AddRange(),添加的时候就已经知道是集合类型,注意不是整个数组当成一个元素!
list.Add(1);
int[] a = new int[]{1,2,3} list.AddRange(a);
清空:list.Clear();
清除某一项:list.Remove(X); 删除集合list中第一个X
通过下标清除某一项:list.RemoveAt(int a);
删除一个下标范围内的项:list.RemoveRange(int a, int b); a是删除的第一个项的下标,b是清除范围的长度
集合元素顺序反转:list.Reverse(); 注意,如果集合类型通过AddRange()作为元素放在集合中,集合reverse连这个元素内部的数据都会反转
插入元素:list.Insert(int a, X); 在下标a处插入数据X
插入集合:list.InsertRange(int a, L);
判断是否有某元素:list.Contains(X); 和Add()配合使用往集合添加元素
count属性:当前元素个数
capcity属性:可容纳的元素个数
当count大于capcity时,向内存申请多一倍的空间(开辟新空间两倍于原空间,复制数据,销毁原空间)
所以要注意,往空集合添加元素时不要用list.Count作为循环判断,因为刚刚new出来的ArrayList,Count和Capcity都是0。
Hashtable 键值对 Key-Value
Hashtable ht = new Hashtable(); ht.Add(Key,Value); if (ht.ContainsKey(Key)) { Console.WriteLine(ht[Key]); }
ht.Add(Key,Value); --- 添加键值对
ht.ContainsKey(Key) --- 是否包含某键
ht[Key] --- 访问与某键相对应的值
=====================================================================================================================
ArrayList对集合长度没有限制,元素类型没有限制,但是访问时都是object类型,不方便,采用泛型集合来限制元素类型(保留了对长度无限制的好处,访问时也方便,不需要做强制转换)
强制转换有继承关系的值类型到引用类型(object)可能发生装箱过程,反过来则可能发生拆箱过程,都会影响系统性能,所以要尽量避免使用ArrayList(ArrayList的元素均是object)
List<int> l = new List<int>();
其方法与ArrayList类似,同时可以转换为数组(反过来也有array转为list的方法ToList())
int[] iArray = l.ToArray();
类似于ArrayList与List<>,Hashtable也有限制键/值类型的集合 --- Dictionary<>
Dictionary<int,string> dic = new Dictionary<int,string>();
其方法与Hashtable类似。
var表示推断类型,常与foreach配合使用,适用于不知道元素类型的情况
foreach(var item in dic.Keys) { Console.WriteLine("dic[item]"); }
成对访问 KeyValuePair
foreach(KeyValuePair<int,string> kv in dic) { Console.WriteLine("{0}---{1}",kv.Key,kv.Value); }