天天看點

C#的資料結構詳解

1.數組:元素序列,存放形同類型的變量,對象,每一項都有一個整數索引(下标);元素位于一個連續存儲的記憶體塊中;數組空間大小是固定的

數組分類:一維數組,多元數組(等于或大于二維)

聲明數組的格式(定義數組類型):

數組類型 [] 數組名稱;

執行個體化數組:

new 數組類型 [數組大小];

一般數組是作為一個整體進行執行個體化:

int[] array=new int [7];

數組初始化:

數值元素的數組的預設值是0,引用類型元素的數組的預設值是null,一般初始化作為一個整體進行

int [] array=new int [3]{1,2,3};

初始化文法格式如下:

資料類型[] 數組名=new 資料類型[數組大小]{初始值個數要等于數組大小};

資料類型[] 數組名=new 資料類型[]{初始值序列};

資料類型[] 數組名={初始值序列};

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 數組初始化問題
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array0;  //定義數組

            int[] array = new int[7]; //建立執行個體也是作為一個整體進行
                                        //不進行初始化,數組也能正常使用                   

            int a = array.Length;
            Console.WriteLine(a);
            foreach (int b in array)
            {
                Console.WriteLine(b);
            }
            array[0] = 1;//正常指派
          

            int[] array2 = new int[8] { 1, 2, 3, 45, 5, 6, 6, 6 };                         //數組初始化也是作為一個整體初始化的,有三種初始化方法
                                                                                           //Array類中沒有Add()方法

        }
    }
}
           

匿名數組:

與匿名類型相似,用var關鍵字代替具體的資料類型,所引用的資料類型不需要預先定義

格式:

var 數組名=new [] {一定要有初始值};

eg:var array=new[]{1,2,3};

注意點:數組元素是相同類型,或是可以進行隐式轉換的類型,數組維數也由初始值決定

錯誤例子:

var array=new[]{1,3,“Monday”};

2.集合:也是資料容器,不同于數組,集合可以改變空間大小,不固定空間大小

集合分為泛型集合和非泛型集合:

泛型集合類 位于System.Collections.Generic;

非泛型集合類 位于System.Collections;

泛型集合:泛型是一種類型占位符,可以作為集合的資料類型指定

格式:

//List<T> 集合名=new List<T>();
List<String> b = new List<string>();
            b.Add("a");
            b.Add("b");
            b.Add("c");
            Console.WriteLine(b[1]);

            b.RemoveAt(1);
            Console.WriteLine(b[1]);
            //會補位,可以動态改變空間大小的集合都有這種特征
           

非泛型集合(有四個類型):

ArrayList 數組集合類,類似于數組但可以随意更改空間大小,所有存儲在ArrayList對象裡的元素,其元素類型都會預設轉化為object類型,是以可以接受任何類型的資料,但是有裝箱操作,當使用ArrayList中的元素時,要進行拆箱操作,而且這拆箱操作不是自動實作,需要人為操作,而且造成性能損耗,費時費力,推薦使用泛型集合

ArrayList a = new ArrayList();
            a.Add("a");
            a.Add("b");
            a.Add("c");
            a.Remove("b");//會補位
            string str = a[1].ToString();
            foreach (string i in a)
            {
                Console.WriteLine(i);
            }
            //作為表達式不能單獨使用 a[0]
            string sss = a[0].ToString();
           

Hashtable 哈希表,鍵/值對的集合,這些鍵/值對 可以跟據 鍵的哈希代碼進行組織(哈希表的做法其實很簡單,就是把Key通過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,然後就将該數字對數組長度進行取餘,取餘結果就當作數組的下标,将value存儲在以該數字為下标的數組空間裡。

而當使用哈希表進行查詢的時候,就是再次使用哈希函數将key轉換為對應的數組下标,并定位到該空間擷取value,如此一來,就可以充分利用到數組的定位性能進行資料定位)

Hashtable中key value鍵值對均為object類型

哈希表雖然與字典很相似,不過哈希表是有序,字典是無序

數組,集合 與 字典不同,數組,集合有序,字典無序

Hashtable tab = new Hashtable();
            tab.Add("name", "Tom");
            tab.Add("age", 10);
            string name = tab["name"].ToString();
           

Queue 隊列,先進先出的特點,元素預設為object類型(裝箱)

Queue q = new Queue();
            q.Enqueue(1);//入隊
            q.Enqueue(2);
            int number = (int)q.Dequeue();//出隊
            foreach (int num in q)
            {
                Console.WriteLine(num);
            }
           

Stack 堆棧,先進後出的特點,元素預設為objetct類型(裝箱)

Stack s = new Stack();
            s.Push(1);//入棧
            s.Push(2);
            int n = (int)s.Pop();//出棧
            Console.WriteLine(n);
            foreach (int num in s)
            {
                Console.WriteLine(num);
            }
           

無法用[] 索引通路隊列和堆棧

3.字元串:字元的有序集合,字元是指符合Unicode編碼的字元;C#中string是指向.Net Framework的基類System.String,String類專門處理字元串的類庫,string是String類的别名(int,char…)

String對象是System.Char對象的數組

string s = "Hello World";
            char c = s[1];
           

String對象不可變是指一般情況下,我們将“一經指派,其值就不能被更改”視為不變性,字元串一經指派,其值就不能被更改。看來似乎修改了String對象實際上傳回了一個包含修改内容的新String對象

StringBuilder類

動态字元串,可以StringBuilder類建立的對象上對字元串進行更改