区别于以往的C++描述的数据结构,在C#中,数据结构有了新的解释与描述,那就是基于.NET Framework类库的一个数据结构类-----Collection Class, 在这个Collection类中,涵盖了Array, ArrayList, Stack, Queue, Hash Table SortedList等等一系列的数据结构类型。一言蔽之,在C#中,数据结构的概念就是数据集合(data collection)。

线性集合(Liner collection)和非线性集合(nonliner collection)两种。其中,线性集合就是其元素具有唯一的前驱和后继的数据结构类型,例如数组(array)和数组列表(arrayList)以及堆栈和队列;而非线性集合就是指具有多个前驱或者后继的数据结构类型,例如树,图,堆,网等。

线性集合(Liner collection)根据访问方式的不同主要分为三大类:

(1)可直接访问的集合类型(Direct Access Collection):该类型的集合数据元素可以直接通过下标(index)来访问,有三种:Array,string,struct。

    其中,string是一个具有值类型表现的特殊的引用类型,如果改变一个string,不能直接改变原string,实际上是像值类型那样,创建了一个新的string,然后赋值。

    至于struct,它跟class的区别就是结构是值类型,而类是引用类型,在使用上,结构的声明和类基本一模一样,C# 中的结构有了更加强大的功能,可以在结构中定义方法,属性和构造函数,然后new一个结构实例使用这些结构成员(整型int,实际上是调用了Int32结构,属于该结构的方法parse()也就可以被整型变量使用)。在创建语法上,结构和类是相同的,只是他们的存储位置不同,使用场合也不同。结构主要用于小的数据结构,结构存储在堆栈上,结构变量声明的时候使用的时候既可以像普通值类型来声明初始化一个结构变量(例如:Dimension是一个结构,可以用如下方法来声明及初始化一个Dimension类型的变量point: Dimension point; point.Length =3; point.Width =6;),也可以用new关键字创建一个结构实例。

    结构和方法使用上最大的区别就是:结构不是为继承而生的,不能从一个结构中继承,一般也不用结构来派生!唯一的例外是结构派生于类system.object,所以结构可以访问system.object的方法。尽管在.NET环境中,有一些数据元素是以class的方式来调用的(例如array和string),但也有很多数据类型是以结构的方式来调用的,例如数值型数据,其中的int型数据就是以Int32结构的方式来调用的,Int32结构中定义了很多有用的方法,例如:Int32.parse(String)方法,就可以将字符串形式表示的一个数字转换为整型。对于结构的使用,有两段代码可供参考:

using System;
using System.Collections.Generic;
using System.Text;

/*
 * C#中,结构中可以定义方法,构造函数,属性,字段;使用的时候既可以像普通值类型来声明初始化一个结构变量,也可以用new关键字创建一个结构实例.
 * 但是,类是引用类型,结构是值类型。也是一个Direct access collection type in DataStruct
 * 结构和类的定义与使用基本相同,唯一的不同是结构不能像类那样可以继承与派生其它类
 */
namespace Chapter1_Struct
{
    public struct Name
    {
        private string fname, mname, lname;
        //define the constructor of this struct
        public Name(string first, string middle, string last)
        {
            fname = first;
            mname = middle;
            lname = last;
        }
        public String FirstName
        {
            get
            {
                return fname;
            }
            set
            {
                fname = value;
            }

        }
        public String MiddleName
        {
            get
            {
                return mname;
            }
            set
            {
                mname = value;
            }

        }
        public String LastName
        {
            get
            {
                return fname;
            }
            set
            {
                fname = value;
            }

        }
        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)));
        }
    }
    class NameTest
    {
        static void Main(string[] args)
        {
            Name myName = new Name("steven", "liu", "sir");
            string fullName, inits;
            fullName = myName.ToString();
            inits = myName.Initials();
            Console.WriteLine("My name is {0}", fullName);
            Console.WriteLine("My initials are {0}", inits);
            Console.Read();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace Chapter1_Struct_Int32
{
    class Program
    {
        static void Main(string[] args)
        {
            int sum,num,num1=2;
            string snum;
            Console.Write("Enter a number:");
            snum = Console.ReadLine();
            num = Int32.Parse(snum);
            sum = num+num1;
            Console.WriteLine("The sum of num and num1 is {0}", sum);
            Console.ReadKey();
        }
    }
}


(2)顺序访问的集合类型(Sequential Access Collection):该类型的集合是按顺序在一个表中存储数据元素的,这个表是线性的,且这个表的大小可变,能够动态地扩大和缩小。(就是我们常说的数据结构中的顺序表,在一片连续的区域中存储数据),表中的数据元素不能直接通过下标来访问,而是通过对其地址的引用来访问。 主要包括堆栈(stack)和队列(queue)。

(3)泛化的下标的集合类型(Sequential Access Collection):主要包括哈希表和字典。

线性集合(nonLiner collection)根据访问方式的主要分为两大类:

(1)层次化的集合:主要是常用于文件系统的树形结构。

(1)组集合:主要是集合和图(网状结构)两种。这种集合中,数据元素无序放置,且每一个的值是唯一的。