集合
集合包括:ArrayList,Hashtable(哈希表),List,Dictionary(字典)。
1、ArrayList
定义:ArrayList mylist=new ArrayList(); //ArrayList 可变长度数组,使用类似于数组
添加数据: ArrayList array = new ArrayList();
array.Add("hello");
array.Add(10);
array.Add("9.9");
array.Add(DateTime.Now);
array.Add("hello");
array.Add(10);
array.Add(9.9);
array.Add(DateTime.Now);
array.Add("hello");
array.Add(10);
array.Add(9.9);
array.Add(DateTime.Now);
//将数组添加到集合中,数组中每一个元素都作为了集合的一个元素
array.AddRange(new string[2] { "ab", "cd" });
//count获取的是集合中实际的个数,caoacity获取的是集合的容量
Console.WriteLine(array.Count);//个数
Console.WriteLine(array.Capacity);//容量
//不会删除集合中相同的元素,只会删除一个,而且从第一个开始删除
删除数据:array.Remove(9.9);
//for (int i = 0; i < 9; i++)
//{
// //为什么会报错,因为集合中的数量会动态更新的,删除一个则count属性的值就会更新
// array.RemoveAt(i);
//}
for (int i = 0; i < 6; i++)
{
//为什么会报错,因为集合中的数量会动态更新的,删除一个则count属性的值就会更新
array.RemoveAt(i);
}
//虽然集合中所生数组个数不多,但是数组容量还是很大,造成内存空间浪费,这是可以手动缩小集合大小,其实就是在内存中新建一个小数组,将数据拿过来,将原来数组释放掉。
array.TrimToSize();(缩小集合大小)
Console.WriteLine(array.Count);//个数
Console.WriteLine(array.Capacity);//容量
Console.ReadKey();
遍历数组: for (int i = 0; i < array.Count; i++)
{
Console.WriteLine(array[i]);
}
2、Hashtable(哈希表)
在ArrayList中如果要查找一个元素,必须要遍历数组,假如数组有一万条数据会很耗内存的。所以我们可以定义Hashtable(哈希表)。
定义: Hashtable table = new Hashtable();
//当我们执行添加操作时,发现两个参数都是object类型,这就意味着对象添加到集合中之后就会被转换成object类型,就是进行了装箱操作。
添加数据: table.Add("张三", 20); //添加的数据有Key和Value。方便查找数据
table.Add("李四", 21);
table.Add("王五", 22);
table.Add("赵六", 23);
table.Add("陈麻子", 24);
#region 修改和删除
table["陈麻子"] = 25;
Console.WriteLine("陈麻子的年龄为{0}", table["陈麻子"]);
table.Remove("陈麻子");
foreach (DictionaryEntry item in table)
{
Console.WriteLine("{0}的年龄为{1}", item.Key, item.Value);
}
#endregion
#region 在hashtable中寻找需要的元素
foreach (DictionaryEntry item in table)
{
//当我们执行读取操作的时候,因为每个键值对中的无论键还是值都曾经被转换成object类型,所以取出来的时候也是这个类型,要进行比较,就需要转换成存进去之前的类型
if (Convert.ToString(item.Key) == "王五")
{
Console.WriteLine("王五的年龄为{0}", item.Value);
}
}
#endregion
A、用Hashtable声明的对象中的Key和Value是结构DictionaryEntry中的方法,所以Hashtable声明的对象的类型是DictionaryEntry,
所以foreach中的类型写为DictionaryEntry
B、如果想用foreach遍历,对象要实现了IEnumerable这个接口
3、List是ArrayList的升级版,减少了装箱和拆箱的操作。ArrayList可以添加任何类型的数据,而List只能添加定义时类型的数据。
//ArrayList list = new ArrayList();
//因为List集合限定了存放数据的类型,导致防止内容没有ArrayList方便,但是取数据方便,而且效率高。为什么?因为既然限定了数据的类型,那么在存放数据的时候就省去了装箱的操作,同样取数据的时候因为事先就知道是什么类型,所以也省去了拆线操作。
定义:List<int> list = new List<int>();
添加数据: list.Add(10);
list.Add(11);
list.Add(12);
list.Add(3);
方法:Sort()(排序从小到大)、Max()、Min()、Sum()…
删除和更改数据与以上类型基本相同。
遍历和ArrayList基本相同,可以用for也可以用foreach。用foreach时类型不用更改。用var
4、Dictionary(字典)是Hashtable(哈希表)的升级版,和List是ArrayList的升级版的原因差不多。
定义: Dictionary<string, int> dic = new Dictionary<string, int>();
添加数据: dic.Add("张三", 20);
dic.Add("李四", 21);
dic.Add("王五", 22);
dic.Add("赵六", 23);
dic.Add("陈麻子", 24);
#region 修改
dic["陈麻子"] = 25;
#endregion
#region 便利输出值
//foreach (int item in dic.Values)
//{
// Console.WriteLine(item);
//}
#endregion
#region 遍历输出键
//foreach (string item in dic.Keys)
//{
// //Console.WriteLine(item);
// Console.WriteLine("{0}的年龄是{1}",item,dic[item]);
//}
#endregion
#region 遍历输出键值对
foreach (KeyValuePair<string,int> item in dic)
{
Console.WriteLine("{0}的年龄是{1}",item.Key,item.Value);
}
#endregion
遍历输出Dictionary(字典)时,类型需要更改为KeyValuePair<string,int>类型