320 likes | 559 Views
第 4 章 数组与字符串. 主要内容. 几种数组的定义以及使用 字符串的定义以及使用. 4.1 一维数组. 在 C# 中,声明一维数组的语法是在类型后面放一对空的方括号,如下所示: int[] numbers; 数组在被访问之前必须初始化,初始化有 2 种方式。可以由字面形式指定数组的完整内容,也可以先直接指定数组的大小,再使用关键字 new 初始化所有的数组元素。. 声明以及初始化数组. int[] numbers={1 , 2 , 3 , 4 , 5} ; int[] numbers=new int[5]{1 , 2 , 3 , 4 , 5};
E N D
主要内容 • 几种数组的定义以及使用 • 字符串的定义以及使用
4.1 一维数组 • 在C#中,声明一维数组的语法是在类型后面放一对空的方括号,如下所示: int[] numbers; • 数组在被访问之前必须初始化,初始化有2种方式。可以由字面形式指定数组的完整内容,也可以先直接指定数组的大小,再使用关键字new初始化所有的数组元素。
声明以及初始化数组 int[] numbers={1,2,3,4,5}; int[] numbers=new int[5]{1,2,3,4,5}; • 当然,我们也可以使用已经赋值的变量来进行初始化,例如: int a=3; int[] numbers=new int[a]; • 数组的下标是从0开始,所以上面那行所定义的数组包含以下3个元素:元素numbers[0],元素numbers[1] 以及元素numbers[2]。
一个关于数组使用的小例子 • 例4.1定义一个字符串数组将几个球员的姓名输入这个数组,并且把他们逆序输出来。
程序代码 • using System.Collections.Generic; • using System.Text; • namespace Example1Of4 • { • class Program • { • static void Main(string[] args) • { • Console.WriteLine("请输入球员个数:"); • int playerNo = int.Parse(Console.ReadLine()); • string[] names = new string[playerNo]; • for (int i = 0; i < names.Length; i++) • { • Console.WriteLine("请输入第{0}个球员的名字",i+1); • names[i]=Console.ReadLine(); • } • Console.WriteLine("你输入的球员名字分别是:"); • for (int i = 0; i < names.Length; i++) • { • Console.WriteLine(names[i]); • } • Console.ReadLine(); • } • } • }
4.2 多维数组与交错数组 • 上面只是定义了一维数组,还可以定义多维数组,语法是在方括号内加逗号。如下所示,定义了一个二维数组: int[,] numbers; • 多维数组的初始化与一维数组的初始化很类似,若集体赋值,则要遵循行先序的原则,这些跟其他语言很类似。 int[,] numbers=new int[2,2]{1,2,3,4}; 这样,就是相当于这样给数组赋值: numbers[0,0]=1; numbers[0,1]=2; numbers[1,0]=3; numbers[1,1]=4; 上面的代码也可以写为: int[,] numbers=new int[2,2]{{1,2},{3,4} };
交错数组 • 在C#中,我们还可以定义一种特殊的数组,数组中的每一行可以不相同,这种数组我们称之为交错数组(Jagged Array)。 • 交错数组的定义例子: int[][] numbers=new int[3][ ]; numbers[0]=new int[2]{ 1,2}; numbers[1]=new int[3] {2,3,4}; numbers[2]=new int[2] {6,7}; 对上面声明的交错数组赋值可以为:numbers[1][1]=6;
4.3 ArrayList类 • .NET框架提供了一个ArrayList类。用于建立可变长度的数组,这种数组的数据类型为Object,在数组元素中允许存放任何类型的数据。ArrayList类包含在System.Collections命名空间中,要在程序的开头添加System.Collections命名空间,才可以使用较简洁的对象名称建立ArrayList对象类。
ArrayLis 类的方法和属性 • ArrayList类是一种可以按需动态增长的数组。它提供了许多用于操作有用方法和属性。
4.4 HashTable • 在.NET Framework中,HashTable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,这些键/值对根据键的哈希代码进行组织。其中key通常可用来快速查找,同时key是区分大小写的;value用于存储对应于key的值。
HashTable概述 • HashTable中key/value键值对均为Object类型,所以HashTable可以支持任何类型的key/value键值对。 • HashTable是C#中一个较为复杂的类型,其构造函数就有10几种,这里我们只讲解2种最简单的构造函数来供读者参考: • HashTable() • HashTable(Int32) 第1种构造函数使用默认的参数来初始化HashTable类的新的空实例。类似于ArrayList对象,其容量可以根据实际的需要自动添加。 第2种构造函数使用指定的容量来初始化HashTable类的新的实例。这里我们指定的容量只是初步判断的容量,可以在后来的使用过程中根据实际需求进行修改。 下面的代码是创建HashTable的新实例: • HashTable ht1=new HashTable(); • HashTable ht2=new HashTable(15);
HashTable的简单操作 • 类似于前面我们对数组的操作,我们可以对哈希表进行元素的添加、删除、查找等操作,下面具体讲解一下: • 在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value); • 在哈希表中去除某个key/value键值对:HashtableObject.Remove(key); • 从哈希表中移除所有元素: HashtableObject.Clear(); • 判断哈希表是否包含特定键key: HashtableObject.Contains(key);
一个关于HashTable操作的例子 • using System; • using System.Collections; //使用Hashtable时,必须引入这个命名空间 • class hashtable • { • public static void Main() • { • Hashtable ht=new Hashtable(); //创建一个Hashtable实例 • ht.Add("E","e");//添加key/value键值对 • ht.Add("A","a"); • ht.Add("C","c"); • ht.Add("B","b"); • string s=(string)ht["A"]; • if(ht.Contains("E")) //判断哈希表是否包含特定键,其返回值为true或false • Console.WriteLine("the E key:exist"); • ht.Remove("C");//移除一个key/value键值对 • Console.WriteLine(ht["A"]);//此处输出a • ht.Clear();//移除所有元素 • Console.WriteLine(ht["A"]); //此处将不会有任何输出 • } • }
遍历HashTable • C#中提供了Foreach语句以对HashTable进行遍历。由于HashTable的元素是一个键/值对,因此需要使用DictionaryEntry类型来进行遍历。DictionaryEntry类型在此处表示一个键/值对的集合。 下面的代码则可以实现对HashTable中的元素进行遍历: foreach(DictionaryEntry de in ht) //ht为一个Hashtable实例 { Console.WriteLine(de.Key);//de.Key对应于key/value键值对key Console.WriteLine(de.Value);//de.Key对应于key/value键值对value }
对HashTable进行排序 • 对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法: ArrayList akeys=new ArrayList(ht.Keys); //别忘了导入System.Collections akeys.Sort(); //按字母顺序进行排序 for(string skey in akeys) { Console.Write(skey + ":"); Console.WriteLine(ht[skey]);//排序后输出 }
4.5 字符与字符串 • C#内置支持功能完全的string类型。更重要的是,C#把字符串也当成对象,封装了所有字符串所拥有的操作、排序和搜索方法。 • 复杂的字符串处理模式匹配要依靠正则表达式的帮助。C#将正则表达式语法的强大与复杂同完全的面向对象设计结合起来了。
4.5.1字符串的声明和初始化 • 定义字符串最基本的方式是把一个双引号括起来的字符串赋给一个string类型的变量: string s = "abcdef";
字符串的声明和初始化 • 双引号括起来的字符串可以包含转义字符,如“\n”或“\t”,都以反斜线开始,用来表示换行或制表。由于反斜线本身在一些命令行语法(如URL或者目录路径)中会用到,引号括起的字符串中,反斜线必须在其自身前面再加一个反斜线。如下面代码所示: string directory = "C:\\text";
字符串的声明和初始化 • 字符串也可以用原样的字符串字面值创建,以“@”符号开头。这样string构造方法就知道字符串应照原样使用,即使它要跨行或者含有转义字符。在原样字符串字面值中,反斜线和字符串可以简单地看成是多余的字符。因此,上面的程序代码 string directory="C:\\ "; 也可以改写成如下的代码: string directory = @"C:\text";
4.5.2 字符串的处理 • string类型变量可以看作是char变量的只读数组。这样,就可以使用下面的语法访问每个字符: string myString = "abcdef"; char myChar= myString[1]; 同时,我们还可以使用ToCharArray() 函数,把string类型的变量转存到字符数组里面了。
一个string转化为字符数组的例子 • 例把一个string变量的所有值存放到一个字符数组里面去 。 程序代码: • using System; • using System.Collections.Generic; • using System.Text; • namespace stringExample • { • class Program • { • static void Main(string[] args) • { • string s = "abcdef"; • char[] myChar = s.ToCharArray(); • Console.WriteLine("字符数组myChar输出如下:"); • foreach(char c in myChar) • { • Console.WriteLine("{0}",c); • } • Console.ReadLine(); • } • } • }
字符串的拼接 • 字符串的串接(合并)是指使用“+”符号连接前后两个字符串: • string city = "南京市"; • string street = "新街口"; • string address = city + street; • Console.WriteLine(“地址是:”+address); 上述代码的输出结果为:“地址是:南京市新街口”。
String类的方法和属性 • String类有很多方法和属性,常见的有:Length 属性、ToUpper/ToLower 方法、IndexOf 方法、SubString 方法等。
Length属性介绍 • Length属性是描述字符串长度的属性 string str2=”you are welcome!”; int n=str2.Length; 那么n就得到str2字符串的长度
ToUpper/ToLower 方法介绍 • ToUpper()方法是把字符串中所有的字母 都变成大写 • ToLower()方法是把字符串中所有的字母 都变成小写
IndexOf 方法介绍 • IndexOf()方法是从str1字符串找出第一次出现某子字符串的位置 string str1=”you are welcome”; int n=str1.IndexOf(“are”); 那么n的值为4;
SubString ()方法 • SubString ()方法是从str1字符串的n1个字符开始,长度为n2的子串 str1.SubString(n1,n2);
小结 • 本章主要讲了数组和字符串处理的基础知识。在C#中,数组是通过在类型和变量名之间放置一个空方括号来进行说明。C#数组可以是一维数组、多维数组或者是交错数组。字符串的处理在本章中我们讨论了几个基本的技巧,字符串处理的方法我们在表中大多已经列出,使用字符串处理的各种方法以及多个方法的组合可以达到很好的效果。