System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
常用的集合为ArrayList类;特殊集合一般会用到Queue队列集合、Stack栈集合还有Hashtable哈希表集合。
集合不同于数组,是一组可变数量的元素的组合,这些元素可能共享某些特征,需要以某种操作方式一起进行操作。一般来说,这些元素的类型是相同的。
集合与数组的区别:数组是连续的、同一类型数据的一块区域,而集合可以是不连续的、多种数据类型的。
ArrayList集合
相同点:
(1)两者都实现了IList、ICollection、IEnumerable接口;
(2)两者都可以使用整数索引访问集合中的元素,包括读取和赋值,且集合中的索引都从0开始。
不同点:
(1)ArrayList是集合,而Array是数组;
(2)ArrayList是具体类,Array是抽象类;
(3)数组必须在实例化时指定元素的数量,该数量一旦确定就不可以更改了,而ArrayList扩展了这一点,当实例化一个ArrayList实例时可以不指定集合元素数(有默认初始容量),当然你也可以指定初始容量;
(4)获取数组的元素数时使用Length属性,而获取ArrayList集合的元素数时使用Count属性;
(5)数组可以有多维,而ArrayList只能是一维。
ArrayList al = new ArrayList(); //初始化
//赋值
al.Add(3); //将对象添加到 ArrayList 的结尾处 元素
al.Add(5);
al.Add(1);
al.Add(8);
al.Add(4);
//错误 因为5号索引之前就没有,所以直接赋值不可以
al[5] = 9;
//正确 改值
al[4] = 9;
//查看个数
Console.WriteLine(al.Count);//获取 ArrayList 中实际包含的元素数
//清空集合
al.Clear(); //从 ArrayList 中移除所有元素
//克隆集合
ArrayList al1 = new ArrayList();
al1 = (ArrayList)al.Clone();//创建 ArrayList 的浅表副本
//强转
Console.WriteLine(al1[2]);
//判断是否包含某个元素
Console.WriteLine(al.Contains(6));
//查看第一次出现该元素的索引号 若没有,返回-1
Console.WriteLine(al.IndexOf(1));
//查看最后一次出现该元素的索引号
Console.WriteLine(al.LastIndexOf(9));
//在1号索引的位置插入一个4,后面数据的索引依次靠后
al.Insert(1, 4);
//移除某个元素的第一次出现的值
al.Remove(5);
Console.WriteLine(al[0]); //al[索引号]
//移除 ArrayList 的指定索引处的元素
al.RemoveAt(2);
Console.WriteLine(al[2]);
//排序
for (int i = 0; i < al.Count; i++)
{
Console.WriteLine(al[i]);
}
Console.WriteLine();
al.Sort(); //排序,升序
for (int i = 0; i < al.Count; i++)
{
Console.WriteLine(al[i]);
}
//改为降序
al.Reverse(); //翻转集合
for (int i = 0; i < al.Count; i++)
{
Console.WriteLine(al[i]);
}
//遍历集合
foreach (object aa in al)
{
Console.WriteLine(aa);
}
int[] array = new int[] { 2, 3, 4, 6, 7, 8, 9, 2 };
foreach (int aa in array)//遍历数组
{//定义一个什么类型的数据在数组或集合里面
Console.WriteLine(aa + 2);
}
例:输入人数,输入每一个人的分数 求平均分 最高分 最低分
ArrayList al = new ArrayList();
Console.Write("请输入班级人数");
int a = int.Parse(Console.ReadLine());
for (int i = 0; i < a; i++)
{
Console.Write("请输入第{0}个同学的分数:",i+1);
al.Add(int.Parse(Console.ReadLine()));
}
double sum = 0;
for (int i = 0; i < a;i++)
{
sum += double.Parse(al[i].ToString());
}
Console.WriteLine("该班平均分为:"+sum/a);
al.Sort();
Console.WriteLine("最低分"+al[0]);
Console.WriteLine("最高分"+al[a-1]);
Console.ReadLine();
例:将每个人名字 年龄存入集合 1.年龄从大到小排列 姓名也需要排列 2.需要知道年龄最大的是谁
Console.Write("请输入人数:");
int a = int.Parse(Console.ReadLine());
ArrayList al = new ArrayList();
for (int i = 0; i < a; i++)
{
Console.Write("请输入第{0}个人的姓名:", i + 1);
al.Add(Console.ReadLine());
Console.Write("请输入年龄:");
al.Add(Console.ReadLine());
}
for (int i = 1; i < a*2; i +=2)
{
for (int j = i; j < a*2 - 2; j +=2)
{
if (int.Parse(al[i].ToString()) < int.Parse(al[j + 2].ToString()))
{
int zhong = int.Parse(al[i].ToString());
al[i]=al[j+2];
al[j+2]=zhong;
string ming=al[i-1].ToString();
al[i-1] = al[j + 1];
al[j + 1] = ming;
}
}
}
foreach (object aa in al)
{
Console.WriteLine(aa);
}
Console.WriteLine("姓名:{0}年龄:{1}", al[0], al[1]);
Console.ReadLine();