数组可以保存多个兑现个,但是某些情况下无法确定到底需要保存多少个对象,由于数组的长度不可变,因此数组将不再适用。
为了保存这些数目不确定的对象C#提供了一系列特殊的类,这些类可以储存任意类型的对象,并且长度可变,统称为集合
集合分类:可以分为非泛型集合和泛型集合,二者均间接实现了IEnumerble接口
非泛型集合:
非泛型集合位于System.Collection命名空间,它可以存储多种类型的对象,其中在常用的是ArrayList集合和Hashtable集合。
泛型集合:
泛型集合位于System.Collection.Generic命名空间,它只能存储一种类型的对象,其中最常见用的是List<T>泛型集合和Dictionary<TKey,TValue>泛型集合。
非泛型集合类ArrayList:
ArrayList集合就像是一个杂货铺,可以容纳不同类型的对象,例如:可以将int,string,object等类型对象同时加入到ArrayList集合中,ArrayList集合提供额一系列添加,删除,移动,修改,查询元素等操作方法。
它还有一个属性:Capacity表示集合容量,它的计算方法和集合长度有关,它容量是4的倍数,比如集合的长度是3,它的容量就是4,比如长度是6,它的容量就是8。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace 非泛型集合ArrayList
{
class Program
{
static void Main(string[] args)
{
//初始化器
ArrayList array = new ArrayList() { 1, 2, 3, 4 };
打印集合
//Print(array);
集合中元素排序反转
//array.Reverse();
打印反转后的集合
//Print(array);
#region 添加元素的方法
//AddRange方法添加集合到ArrayList集合中
array.AddRange(new ArrayList() { "zhangsan", "lisi" });
Console.WriteLine("打印元素");
Print(array);
Add方法添加
array.Add(22);
Console.WriteLine("打印元素");
Print(array);
//Insert方法
array.Insert(1, "你好");
Console.WriteLine("打印元素");
Print(array);
#endregion
#region 查找的方法
bool flag = array.Contains(2);
Console.WriteLine("集合有是否包含指定元素的结果为:" + flag);
int a = array.IndexOf(3);
Console.WriteLine("集合中指定查找元素的第一个所在位置的索引为" + a);
int b = array.LastIndexOf(4);
Console.WriteLine("集合中指定查找元素的第一个所在位置的索引为" + b);
#endregion
#region 移除元素的方法
array.Remove(1);
array.RemoveAt(0);
array.Clear();
#endregion
Console.ReadKey();
}
static void Print(ArrayList array)
{
for (int i = 0; i < array.Count; i++)
{
Console.WriteLine(array[i]);
}
}
}
}
Foreach循环
虽然for循环可以用于遍历集合中的元素,但写法上比较繁琐,为了简化书写,C#提供了foreach循环
Foreach循环遍历集合时,无需循环条件
Foreach 循环语法格式:
Foreach(var item in collection)
{
执行语句;
}
Item变量用于储存每次遍历的元素(默认情况下item为var类型),in为关键字,collection为被遍历的集合
说明:
Foreach循环的次数是由元素的个数决定的,每次循环时,foreach 中都是通过变量将当前循环中的元素记住,从而将集合中的元素遍历输出,实际上,foreach不仅可以遍历集合,还可以遍历数组,可以说foreach循环专门用于变量集合和数组的循环语句。
注意:
Foreach循环只能对遍历到的元素进行读操作,且只能单向遍历,也就是一个元素在foreach循环中只能被访问一次,所以在遍历集合中优先选择foreach,如果需要修改或者需要多次访问某个元素时,在考虑使用for循环
Hashtable集合 非泛型集合类
在ArrayList集合中查找某个元素时,是从索引位置为0的元素开始逐一进行比对的,这就好像一本没有目录的字典中查找某个汉字一样,这样查询的效率极低,为此C#提供了Hashtable集合,该集合又被称为键值对集合,所谓的键就类似于字典中的目录,值就类似于字典中的具体的信息,键与值是对应关系,通过唯一的键能找到对应的值,因此Hashtable这种特性大大提高了查询效率
常用方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace 非泛型集合Hashtable
{
class Program
{
static void Main(string[] args)
{
//实例化对象
Hashtable ht = new Hashtable();
//添加元素
ht.Add(1, "C#");
ht.Add(2, "Java");
ht.Add(3, "Python");
//遍历集合
Print(ht);
PrintOne(ht);
PrintTwo(ht);
//移除键指定元素
ht.Remove(1);
Print(ht);
//移除所有元素
ht.Clear();
Print(ht);
Console.ReadKey();
}
//第一种遍历集合,是通过键来遍历集合
static void Print(Hashtable ht)
{
foreach (var key in ht.Keys)
{
Console.Write(key+":"+ht[key]+"n");
}
}
//第二种遍历集合,是通过值来遍历集合,但是这种遍历方式,是没法显示键
static void PrintOne(Hashtable ht)
{
foreach (var value in ht.Values)
{
Console.WriteLine(value);
}
}
//第三种遍历集合,是通过对象来遍历,通过这种方式可以访问键和值
static void PrintTwo(Hashtable ht)
{
foreach (DictionaryEntry DiEn in ht)
{
Console.WriteLine(DiEn.Key + ":" + DiEn.Value);
}
}
}
}
注意:在Hashtable集合中键和值的默认类型都是object,因此可以向键和值中添加任意类型的对象,在遍历Hashtable集合时,除了通过键来获取对应的值外,还可以直接遍历集合的值或者集合对象DictionaryEntry
List<T>泛型集合
ArrayList集合与Hashtable集合可以存储多种类型的元素,由于集合中的元素类型不一致,在很多情况下,使用foreach循环获取集合中的元素时,需要对他们进行强制类型转换,这种操作大大降低了程序的执行效率,为了解决这个问题,C#提出了泛型集合概念,泛型集合相当于集合制定了某个限制条件,这个条件使集合中只能存储一种类型的元素
List<T>是一种常用的泛型集合,T指某种数据类型,如int,string等,该集合不仅具备ArrayList集合的功能,而且还可以保证List<T>集合只能添加同类型元素,不会出现类型转换的问题
Max()最大值 Min()最小值 Sum()求和
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>() { "北京", "欢迎", "您", "!" };
list.Add("运动会");
Print(list);
List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine("集合中最大的值是:{0}", list1.Max());
Console.WriteLine("集合中最小的值是:{0}", list1.Min());
Console.WriteLine("集合中元素的总和是:{0}", list1.Sum());
Console.ReadKey();
}
static void Print(List<string> list)
{
foreach (string item in list)
{
Console.Write(item);
}
Console.WriteLine();
}
}
}