集合:很多类型的一个集合
数组:长度不可变,类型单一
集合的好处:长度可以任意改变,类型随便
泛型集合:长度可以任意改变,类型单一
ArrayList集合和Hashtable都在System.Collections
集合类型 | 特点 |
---|---|
数组 | 长度不可变,类型单一,类型存放进去类型不变 |
ArrayList | 长度可变,可以存放任意类型,类型存放进去转换为object类型 |
List<> | 长度可变,和ArrayList对应,但是只能存放单一类型,类型存放进去类型不变 |
Hashtable | 长度可变,键值对集合,可以存放任意类型,类型存放进去转换为object类型 |
Dictionary<> | 长度可变,键值对集合,和Dictionary对应,只能存放单一类型,类型存放进去类型不变 |
我们将一个对象输出到控制台,默认情况下,打印的就是这个对象所在的类的命名空间。
using System.Collections; using 集合练习; Person p = new Person(); ArrayList list = new ArrayList(); list.Add(1); list.Add(3.14); list.Add(true); list.Add("张三"); list.Add(5000m); list.Add(new int[] { 1,2,3,4,5,6,7,8,9}); list.Add(p); list.Add(list); for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } Console.ReadKey();
运行结果:
往list里面加任何类型的元素之后,都会转换成object类型,所以放进去类之后,我们想要得到类的内容,我们需要将object类强转成子类。
往集合里面添加数组或者集合的时候,用list.AddRange();
list.AddRange(new int[]{1,2,3,4,5}); list.AddRange(list);
需要注意的是,添加集合或数组的时候,这个集合和数组不是作为一个元素添加进去的.数组和集合里的元素都将作为被添加集合的元素.
list.Clear()
删除全部元素
list.Remove(item)
删除单个元素,写谁删谁
list.RemoveAt(index)
根据下标删除单个元素
list.RemoveRange(StartIndex,EndIndex)
根据下标去移除一定范围的元素
list.Sort()
元素排序
list.Reverse()
元素反转
list.Insert(index,item)
在指定的位置插入一个元素
list.InsetRange(index,item)
在指定的位置插入一个数组或集合
list.Contains(item)
判断集合中是否有某个元素
list.Count
表示这个集合中实际包含的元素的个数
list.Capcity
表示这个集合中可以包含的元素的个数
每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用.
Hashtable 键值对集合[注意:t为小写]
foreach 的效率远远高于for循环
键值对集合对象中,键必须是唯一的,值可以重复。
C#是一门强类型语言
var可以根据变量的赋值自动判断类型,但是尽量别用
键值对集合对象[键] = 值;
using System.Collections; Hashtable ht = new Hashtable(); ht.Add(1, "张三"); ht.Add(2, true); ht.Add(3, '男'); ht.Add(false, "错误的"); //在键值对集合中,是根据键去找值的 foreach (var item in ht) { Console.WriteLine(item); //Console.WriteLine(ht[item]); } Console.WriteLine("=========================="); foreach (var item in ht.Keys) { Console.WriteLine(item); //Console.WriteLine(ht[item]); } Console.WriteLine("=========================="); foreach (var item in ht.Values) { Console.WriteLine(item); //Console.WriteLine(ht[item]); } Console.WriteLine("==========================");
注意:使用foreach遍历集合元素的时候,不能直接输出,例如上面的输出为:
直接遍历Hashtable输出的是元素对象的命名空间。
ht.Add(键,值)
这种方法不会检查有没有重复的键
ht[键] = 值;
这种方法首先会检查当前集合中有没有该键,如果没有,则新建一个,如果有,则覆盖。
ht.Contains()
ht.ContainsKey()
ht.ContainsValue()
List<int> list = new List<>(); list.Add(1); list.AddRange(new int[] {2,3,4,5,6}); list.AddRange(list);
int[] nums = list.ToArray(); List<int> list2 = nums.ToList(); string[] strs = listStr.ToArray(); List<string> listStr = strs.ToList();
//Dictionary<int, string> dic = new Dictionary<int, string>(); //dic.Add(1,"zhangsan"); //dic.Add(2,"lisi"); //dic.Add(3,"wangwu"); //Console.WriteLine(dic[1]); //dic[1] = "新来的"; //Console.WriteLine(dic[1]); //foreach (int item in dic.Keys) //{ // Console.WriteLine("{0}---{1}",item,dic[item]); //} //foreach (KeyValuePair<int,string> kv in dic) //{ // Console.WriteLine("{0}---{1}",kv.Key,kv.Value); //} //Console.ReadKey(); //将一个数组中的奇数放在一个集合中,再将偶数放在另一个集合中 //最终将两个集合合并为一个集合,并且奇数显示在左边,偶数显示在右边 using System.Collections; int[] nums = new int[]{ 0,2,5,6,9,87,46,1,489,56}; List<int> list1 = new List<int>(); List<int> list2 = new List<int>(); foreach (int item in nums) { if (item%2 == 0) { list2.Add(item); } else { list1.Add(item); } } list1.AddRange(list2); foreach (int item in list1) { Console.Write(item+" "); } Console.WriteLine(); //提醒用户输出一个字符串,通过foreach循环将用户输入的字符串赋值 //给一个字符数组 String strOfUsers = Console.ReadLine(); List<char> strsOfUsers = new List<char>(); foreach (var item in strOfUsers) { strsOfUsers.Add(item); } //统计 Welcome to China中每个字符出现的次数,不考虑大小写。 string strWelcome = "Welcome to China"; strWelcome = strWelcome.ToLower();//分析一下这一句,内存空间有没有更改? Dictionary<char, int> dicCount = new Dictionary<char,int>(); foreach (char item in strWelcome) { if (dicCount.Keys.Contains(item)) { dicCount[item] += 1; } else { dicCount.Add(item,1); } } Console.ReadKey();