1.1群集(collection)的定义
群集是一种结构化的数据类型。存储数据,并且提供数据的添、删、改操作,以及对群集不同属性值的设置与返回操作。
群集分为两类:线性与非线性群集。
线性群集是一张元素列表,表中元素顺次相连。(1、2、3、4)计算机世界中数组为线性群集。
非线性群集所包含的元素在群集内没有位置次序之分。(2,3,6,1)计算机世界中 树、堆、图和集都是非线性群集。
1.2群集(collection)的描述
在两种主要的群集类中有几个子类别。线性的群集可能是直接存取群集,也可能是顺序存取的群集。而线性的群集既可以是层次群集,也可以是组群集。
1.2.1直接存取群集(collection)
直接存取集群最常见的实例就是数组。这里把数组定义为具有相同数据类型的元素群集,而且所有数组元素可通过索引直接进行存取访问(Item[0]、Item[1]、Item[2])
数组可以是静态的,这样当声明数组的时候便于针对程序长度来固定指定元素的数量。数组也可以是动态的,通过ReDim或者ReDim Preserve 语句就可以增加数组元素的数量。(注意此方法适用于VB,C#请使用Array.Resize(obj,n))
在c#语言中,数组不只是内置的数据类型,它还是一种类。
我们可以用数组类存储一个线性群集。向数组添加新元素很容易,只需要简单的吧新元素放置在数组尾部。但是,在数组中插入一个元素就不那么高效了。因为要给插入的元素空出位置,所以必须按顺序移动数组元素。从数组的尾部删除一个元素也很效率,但是删除指定任意位置的元素就没有那么效率了。
字符串是直接存取群集的另外一种类型。字符串是字符的群集。和存取数组元素的方式一样也可以基于字符串的索引对其进行存取。在C#语言中,字符串也是作为类对象来实现的。这个类包含一个在字符串上执行标准操作的庞大的方法集合,其中操作有串连接、返回子串、插入字符、移除字符等等。
C#字符串是不可变的。意味着一旦初始化就不能再改变。当要修改字符串的时候,不是改变原始字符串而是创建一个字符串的副本。在某些情况下这种行为可能会导致性能急剧下降,所以.NET框架提供了StringBuilder类来让用户处理可变字符串。
结构(在其他编程语言中也被称为记录)是最后一种直接存取的群集类型。结构是一种复合数据类型。它所包含的数据可能拥有许多不同的数据类型。由于把这些数据的值分别存储在分散的变量内是很容易变混淆的,所以编程语言采用结构来存储此类数据。
C#语言的结构所增加的强大能力就是为执行存储在数据上的操作定义了方法。尽管不能从结构继承或推导出一种新的类型,但是这种做法使得结构在某些地方很像一个类。
using System; public struct Name { private string fname, mname, lname; public Name(string first, string middle, string last) { fname = first; mname = middle; lname = last; } public string firstName { get { return fname; } set { fname = firstName; } } public string middleName { get { return mname; } set { mname = middleName; } } public string lastName { get { return lname; } set { lname = lastName; } } public override string ToString() { return (String.Format("{0} {1} {2}", fname, mname,lname)); } public string Initials() { return (String.Format("{0}{1}{2}", fname.Substring(0, 1),mname.Substring(0, 1), lname.Substring(0, 1))); } } public class NameTest { static void Main() { Name myName = new Name("Michael", "Mason", "McMillan"); string fullName, inits; fullName = myName.ToString(); inits = myName.Initials(); Console.WriteLine("My name is {0}.", fullName); Console.WriteLine("My initials are {0}.", inits); } }