【回顾】C#从入门到精通第七章笔记
C#从入门到精通(第五版)第七章笔记

数组和集合
1.什么是数组
数组是具有相同数据类型的一组数据的集合。
数组中的每一个变量称为数组的元素,数组能够容纳元素的数量称为数组的长度。
2.一维数组
2.1.一维数组的创建
数组作为对象允许使用new关键字进行内存分配。
一维数组的创建有以下两种形式:
语法1:数据类型 [] 数组名;
比如:
代码如下:
int []arr;
但是声明数组后,还不能访问它的任何元素,因为声明数组只是给出了数组名字和元素数据类型。
要想真正使用数组,还要为它分配内存空间。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的语法格式如下:
数组名字=new 数组元素类型[数组元素个数]
比如:
代码如下:
arr=new int[50];
语法2:数据类型 [] 数组名=new 数据类型 [数组元素个数];
这种创建数组的方法就是将数组的声明和内存的分配配合在一起进行。
比如:
代码如下:
int[] arr=new int[50];
2.2.一维数组的初始化
数组的初始化有两种形式:
int[] arr1=new int[5]{1,2,3,4,5};
或
int[] arr2={1,2,3,4,5};
2.3.一维数组的使用
需要存储多个值时,可以使用一维数组,而且可以通过使用foreach 语句或数组的下标将数组中的元素值读出来。
例如:
static void Main(string[] args)
{
int []arr={1,2,3,4,5);//定义一个一维数组,并为其赋值
foreach(int n in arr)/使用foreach 语句循环遍历一维数组中的元素
Console.WriteLine("{0]",n+"");
Console.WriteLine();
}
当然,也可以采用c语言的方式:
// 循环输出数组元素
int[ ] array = new int[5] { 0, 1 ,2, 3, 4}; // 声明并初始化一维数组
for (int i = 0; i < array.Length;i++ ) // 输出数组中的所有元素
{
Console.WriteLine(array[i]);
}
3.二维数组
3.1.二维数组的创建
语法:
数据类型[,] 数组名; 或 数据类型[][] 数组名;
例如:
string[ ,] arr1;
string[ ][ ] arr2;
同一维数组一样,二维数组在声明时也没有分配内存空间,同样也要用关键字new来分配内存,然后才能访问每个变量。
对于第一种:
int[,] a=new int[2,4];
对于第二种:
int[][] a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];
3.2.二维数组的初始化
例如:
int[,] myarr1 = new int[,]{ { 12, 0 }, { 45, 10 } };
int[,] myarr2 = {{12,0},{45,10}};
3.3.二维数组的使用
static void Main(string[] args)
{
int[,] arr = new int[2, 2] { { 1, 2 }, { 3, 4 } };
Console.Write("数组的行数为: ");
Console.Write(arr.Rank);
Console.Write("\n");
Console.Write("数组的列数为:");
Console.Write(arr.GetUpperBound(arr.Rank - 1) + 1);
Console.Write("\n");
for (int i = 0; i < arr.Rank; i++)
{
string str = "";
for (int j = 0; j < arr.GetUpperBound(arr.Rank - 1)+1; j++)
{
str = str + Convert.ToString(arr[i, j]) + "";
}
Console.Write(str);
Console.Write("\n");
}
4.数组的基本操作
C#中的数组是由System.Array类派生而来的引用对象,因此可以使用Array类中的各种方法对数组进行各种操作。
对数组的操作可以分为静态操作和动态操作。
静态操作主要包括查找、遍历和排序等。
动态操作主要包括插入、删除、合并和拆分等。本节将对数组的各种操作进行详细讲解。
4.1数组的遍历
使用foreach语句可以实现数组的遍历功能,开发人员可以用foreach语句访问数组中的每个元素,而不需要确切地知道每个元素的索引号。
比如:
遍历一维数组
int[ ] array = new int[5] { 0, 1 ,2, 3, 4}; // 声明并初始化一维数组
foreach (int i in array ) // 输出一维数组中的所有元素
{
Console.WriteLine(array[i]);
}
再比如:
遍历二维数组
代码1:
int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 3, 4, 5 } };//定义二维数组
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
Console.Write(Convert.ToString(arr[i, j]) + " ");
}
Console.Write("\n");
}
代码2:
int count = 0;
int[,] arr = new int[2, 3] { { 1, 2, 3 }, { 3, 4, 5 } };//定义二维数组
foreach (int i in arr)
{
if(count!=0&&count%3==0)
Console.Write("\n");
Console.Write(i+" ");
count++;
}
4.2对数组进行排序【两种排序】
C#中提供了用于对数组进行排序的方法Array.Sort()和Array.Reverse(),
其中,Array.Sort()方法用于对一维Array数组中的元素进行排序,
Array.Reverse()方法用于反转一维Array数组或者部分Array数组中的元素顺序。
Array.Sort()方法:
int[] arr1 = new int[] { 3, 9, 27, 6, 18, 12, 21, 15 };
Array.Sort(arr1);
foreach(int i in arr1)
Console.Write(i+" ");
Console.WriteLine();
Array.Reverse()方法:
int[] arr2 = new int[] { 3, 9, 27, 6, 18, 12, 21, 15 };
Array.Reverse(arr2);
foreach (int o in arr2)
Console.Write(o + " ");
Console.WriteLine();
原数组: 3 9 27 6 18 12 21 15
Sort:3 6 9 12 15 18 21 27
Reverse:15 21 12 18 6 27 9 3
5、数组排序算法【其实之前说过的Sort和Reverse方法就可以实现排序,这些方法就没必要再学。这是数据结构的部分。学数据结构的时候小白再带大家学。】
(1).冒泡排序法
(2).直接插入排序法
(3).选择排序法
6、ArrayList集合
ArrayList类相当与一种高级的动态数组,它是Array类的升级版。
ArrayList位于System.Collections命名空间下,它可以动态地添加和删除元素。可以将ArrayList类看成扩充功能的数组,但它并不等于数组。
与数组相比:
①.数组的容量是固定的,而ArrayList的容量可以根据需要自动扩充。
②.ArrayList 提供添加、删除和插入某一范围元素的方法,但在数组中,只能一次获取或设置一个元素的值。
③.ArrayList提供将只读和固定大小包装返回到集合的方法,而数组不提供。
④.ArrayList只能是一维形式,而数组可以是多维的。
6.1.ArrayList的构造器有三种
第一种: ArrayList list = new ArrayList();
第二种: (把数组的元素给ArrayList)
int[] arr = new int[5] { 1, 2, 3, 4, 5 };
ArrayList list = new ArrayList(arr);
第三种: 用指定的大小初始化内部的数组。
ArrayList List=new ArrayList(10);
比如:
ArrayList List=new ArrayList(10);
for(int i=0;i< List.Count;i++)//给ArayList对象添加10个int元素
List.Add(i);
ArrayList的常用属性及说明如表所示:

6.2.ArrayList元素的添加【两种添加】
(1).Add方法
该方法用来将对象添加到ArrayList集合的结尾处,其语法格式如下:
public virtual int Add(Object value)
①.value:要添加到ArrayList的末尾处的Object,该值可以为空引用。
②.返回值:ArrayList索引,已在此处添加了value。
比如:
代码如下:
int[] arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr); //使用声明的一维数组实例化一个ArrayList对象
List.Add(7);
(2).Insert方法
该方法用来将元素插入ArrayList集合的指定索引处,其语法格式如下:
public vitual void Insert(int index,Object value)
①.index:从零开始的索引,应在该位置插入value。
②.value:要插入的Object,该值可以为空引用。
比如:
int[] arr=new intl{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. Insert(3,7);
6.3.ArrayList元素的删除【四种删除】
(1).Clear方法——全部删除
语法:
public virtual void Clear ()
例如:
int[] arr=new int[] {1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. Clear();
(2).Remove方法——删除指定元素
语法:
public virtual void Remove (Object obj)
例如:
int[] arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. Remove(3);
(3).RemoveAt方法——删除指定索引处元素
语法:
public virtual void RemoveAt (int index)
例如:
int[] arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. RemoveAt(3);
(4).RemoveRange方法——删除部分元素
语法:
public virtual void RemoveRange (int index,int count)
例如:
int []arr=new int[]{1,2,3,4,5,6};
ArrayList List=new ArrayList(arr);
List. RemoveRange(3,2);
6.4.ArrayList历遍
ArrayList集合的遍历与数组类似,都可以使用foreach 语句
6.5.ArrayList元素的查找【三种查找】
(1).Contains方法【判断是否包含这个元素】
语法:
public virtual bool Contains (Object item)
例如:
int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
ArrayList List = new ArrayList(arr);
Console.Write(List.Contains(2));
(2).IndexOf方法
查找元素,并返回与该元素匹配的第一个索引
(3).LastIndexOf方法
查找元素,并返回与该元素匹配的最后一个索引
例如:
int[] arr = new int[] { 1, 2, 3, 2,4,2, 5, 6 };
ArrayList List = new ArrayList(arr);
Console.Write(List.IndexOf(2));
Console.Write(List.LastIndexOf(2));
7、Hashtable类(System.Collections)【键值对】
7.1Hashtable构造器
public Hashtable ()
public Hashtable (int capacity)
属性图:

7.2.Hashtable元素的添加【键值对】【一个添加】
Add——向Hashtable中添加元素
语法:
public virtual void Add (Object key,Object value)
key是要添加的键
value要添加的值
例如:
Hashtable hashtable = new Hashtable();
hashtable.Add("id", "BH0001");
hashtable.Add("name", "TM");
7.3.Hashtable元素的删除【两个删除】
(1).Clear方法——删除所有元素
语法:
public virtual void Clear ()
(2).Remove方法——删除指定键的元素
语法:
public virtual void Remove (Object key)
7.4.Hashtable的遍历
Hashtable的遍历与数组类似,都可以使用foreach 语句。这里需要注意的是,由于Hashtable中的元素是一个键/值对,
因此需要使用DictionaryEntry类型来进行遍历。DictionaryEntry类型表示一个键/
值对的集合。
例如:
Hashtable hashtable = new Hashtable(); //创建Hashtable对象
hashtable.Add("id", "BH0001"); //向Hashtable中添加元素
hashtable.Add("name", "TM");
hashtable.Add("sex", "男");
Console.WriteLine("\t 键\t 值");
foreach (DictionaryEntry dicEntry in hashtable)
{
Console.WriteLine("\t " + dicEntry.Key + "\t " + dicEntry.Value);
}
7.5.Hashtable元素的查找【三种查找】
在Hashtable中查找元素时,可以使用Hashtable类提供的Contains方法、ContainsKey方法和ContainsValue方法。
下面对这3个方法进行详细介绍。
(1and2).Contains、ContainsKey方法——按键查找【它们功能一样,语法一样】
语法:
public virtual bool Contains (Object key)
public virtual bool ContainsKey (Object key)
例如:
Hashtable hashtable =new Hashtable();//实例化Hashtable对象
hashtable.Add("id","BH0001");//向Hashtable中添加元素
hashtable.Add("name","TM");
hashtable.Add("sex","男");
Console.WriteLine(hashtable.Contains("id"));//判断Hashtable中是否包含指定的键
运行结果为true。
(3).ContainsValue方法——按值查找
语法:
public virtual bool ContainsValue (Object value)
例如:
Hashtable hashtable=new Hashtable();//实例化Hashtable对象
hashtable.Add("id","BH0001");//向Hashtable中添加元素
hashtable.Add("name","TM");hashtable.Add("sex","男"”);
Console.WriteLine(hashtable.ContainsValue("id"));//判断Hashtable中是否包含指定的键值
运行结果为false。
【回顾一下】:
(1).对数组进行排序【两种排序】
(2).ArrayList元素的添加【两种添加】
(3).ArrayList元素的删除【四种删除】
(4).ArrayList元素的查找【三种查找】
(5).Hashtable元素的添加【一种添加】
(6).Hashtable元素的删除【两个删除】【key】
(7).Hashtable元素的查找【三种查找】
第七章完!