第十一章 数组和集合对象
回顾 线程是在共享内存空间中并发的多道执行路径 在 C# 中,是使用 System.Threading 命名空间中的 Thread 类来创建线程的 线程优先级可以更改为 ThreadPriority 枚举中定义的值 C# 中的 lock 关键字是实现线程同步的一种方法 同步的线程称为安全线程 除非绝对必要,否则不要创建线程安全的代码,因为添加不必要的锁定会降低性能
目标 使用System.Array 对象 理解集合对象的特点和优点 使用System.ArrayList 对象 使用哈希表对象
System.Array 简介 3-1 int score[ ] = new int[7]; 第一位学生的分数 score [0] 存储学员的分数 5 6 4 数 组 应用程序 7 int score[ ] = new int[7]; int score1; System.Console.ReadLine(score1) int score2; System.Console.ReadLine(score2) int score3; System.Console.ReadLine(score3) int score4; System.Console.ReadLine(score4) int score5; System.Console.ReadLine(score5) int score6; System.Console.ReadLine(score6) int score7; System.Console.ReadLine(score7) 第一位学生的分数 score [0] 3 第二位学生的分数 score [1] 2 第三位学生的分数 score [2] 第四位学生的分数 score [3] 1 第五位学生的分数 score [4] 第六位学生的分数 score [5] 在数组的术语中,元素表示数组中存储的值,数组长度指数组中存储的值的总数,数组秩指数组的总维数 第七位学生的分数 score [6]
可以执行各种操作,如存储、检索、排序和反转 System.Array 简介 3-2 数组定义:数据类型[ ] 数组名称; int[] MyArray = {1,2,3,4,5,6,7}; 如何简易地执行对数组的操作? System . Array MyArray[0], MyArray[1], MyArray[2]…………MyArray[6] 可以执行各种操作,如存储、检索、排序和反转 MyArray [0] = 604
System.Array 简介 3-3 System.Array Array是抽象的基类,提供 CreateInstance 方法来创建数组 Array obj = Array.CreateInstance(typeof(string),10);
System.Array 的属性和方法 方法 属性 Clear Length CopyTo Rank IsReadOnly BinarySearch Clear Length Copy CopyTo Rank CreateInstance GetLength IsReadOnly GetLowerBound GetValue IsFixedSize GetUpperBound IndexOf LastIndexOf Reverse SetValue Sort
将 objNames 实例化为字符串对象并且其中存放 5 个元素 示例 2-1 static void Main(string[] args) { //构建 objNames 数组 Array objNames = Array.CreateInstance (typeof(string),5); //初始化值 objNames.SetValue(“A",0); objNames.SetValue(“B",1); objNames.SetValue(“C",2); objNames.SetValue(“D",3); objNames.SetValue(“E",4); Console.WriteLine(“数组值"); for(int ctr = 0 ; ctr < 5; ctr++) Console.WriteLine(“元素 {0}: {1}",ctr+1, objNames.GetValue(ctr)); } 将 objNames 实例化为字符串对象并且其中存放 5 个元素 使用 SetValue() 方法存储字符串 使用 GetValue() 方法检索数组值
示例 2-2 课堂练习: 这段代码用For Each结构怎么写? Console.WriteLine(“\n数组中元素的总数是 {0}",objNames.Length.ToString()); //输出数组秩 Console.WriteLine("\n数组秩是 {0}",objNames.Rank.ToString()); //反转数组并输出 Array.Reverse(objNames); Console.WriteLine(“\n反转数组后"); for(int ctr = 0 ; ctr < 5; ctr++) { Console.WriteLine(“元素 {0}: {1}",ctr+1, objNames.GetValue(ctr)); } 显示 objNames数组的长度 显示 objNames数组秩 反转数组元素 反转后的数组元素列表 课堂练习: 这段代码用For Each结构怎么写?
思考和演示 使用: int[ ] A = {1,2,3,4,5,6} 和使用: B.CreateInstance (typeof(string),5) 创建的数组,A可以使用B所有的属性和方法吗? 教员演示两种数组的差别
System.Collections 简介 2-1 Employee 对象的集合 System.Collection ID 工作档案 ID 工作档案 ID 工作档案 ID 工作档案 职员 1 职员 3 职员 2 职员 4 对象组中元素个数未知,并且随时可能要循环、添加和移除
System.Collections 简介 2-2 类 接口 结构
Hashtable objFriendDetails = new Hashtable(); 属性 Count Keys Values 方法 Add GetEnumerator Remove Hashtable objFriendDetails = new Hashtable();
使用哈希表对象 教员演示使用哈希表的例子程序
ArrayList 类 2-1 ArrayList的特点 Array 类的容量或元素数是固定的,而 ArrayList 类的容量可以根据需要动态扩展。通过设置ArrayList.Capacity 的值可以重新分配内存和复制元素 使用 ArrayList 提供的方法可以同时添加、插入或移除一个范围内的元素 数组灵活性 可以设置数组的下界 数组可以有多个维 许多需要使用数组的实例都可以使用ArrayList
ArrayList 类 2-2 属性 Capacity 方法 Count Add Contains Insert Remove RemoveAt TrimToSize
简单的例子 ArrayList List = new ArrayList(); //给数组增加10个Int元素 for( int i=0;i<10;i++ ) List.Add(i); //..程序做一些处理 //将第6个元素移除 List.RemoveAt(5); //再增加3个元素 for( int i=0;i<3;i++ ) List.Add(i+20); //返回ArrayList包含的数组 Int32[] values = (Int32[])List.ToArray(typeof(Int32));
教员演示使用ArrayList的例子程序
总结 多数编程语言都提供数组这种数据结构,用以存储属于相同类型的多个数据元素 可以使用 Array 类的 CreateInstance 方法来创建Array对象,也可以直接定义数组对象 集合可用于管理在运行时动态创建的元素项 System.Collections 命名空间提供一组接口和类,让用户可以对一组数据元素执行各种集合操作 用户可以通过 HashTable 类将数据、键值作为一组来存储,这些数据是根据键值进行组织的 Array 类属于 System 命名空间,而 ArrayList 类属于 System.Collections 命名空间 ArrayList在Array的基础上提供了动态的特性