最全的數據結構解析與概括

最全的數據結構解析與概括


本文對經常使用的數據結構:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable, IEnumerable等進行詳述。mysql


1、Collection(集合)
Collection是數據記錄集合,編寫代碼過程當中,經常須要合適的容器保存臨時數據,方便修改和查找,如何選取合適的數據容器,關鍵在於將執行的數據操做以及數據記錄是否大量。
算法


2、Array(數組)sql

特徵數據庫

1. 固定大小,數組的大小是初始化時決定沒法修改的數值。數組

2. 強類型,存儲數據元素類型必須在初始化時指定,所以在運行時,不須要耗費額外的時間來定義數組類型,可以大大提高運行效率。服務器

3. 可以使用Foreach關鍵字實現數組迭代和查找。數據結構

由於數組大小是固定的,且是強類型數據結構,所以在運行時只佔用不多的內存,運行時效率很高。ide


3、ArrayList函數

1. ArrayList 沒有固定的長度,容量可動態增長,可應用於開發人員沒法肯定數組元素個數等場景,固然這種狀況下,在定義結構體的時候會很是耗時。性能

2. ArrayList 不是強類型,ArrayList中不一樣元素類型能夠不相同,而且須要在運行時根據實際的輸入來肯定元素類型。所以在運行時消耗內存較多。

3. 可以使用Froeach 關鍵字操做ArrayList。

ArrayList支持String,int,以及十進制小數類型。


4、HashTable(哈希表)

HashTable是一種定義關鍵字的數據結構體,使用哈希表查找數據很是方便,哈希表既不是強類型也不固定大小限制。


5、Stack

棧是最典型的數據結構,棧具備優先級劃分的數據結構,棧爲每一個內容項定義優先級,表示每一個Item入棧和出棧的優先順序。所以操做棧中的數據,須要先將數據push 到棧的頂部,須要刪除元素必須變成棧頂部,即要遵照後進先出(LIFO)的原則。

棧與哈希表同樣既不是強類型也不限制元素個數。

Push 操做

  1. //Stack is LIFO: Last in First Out

  2. System.Collections.Stack objStackPush = new System.Collections.Stack();


  3. //By Push method you can insert item at the top of the stack

  4. objStackPush.Push("Mahsa");

  5. objStackPush.Push("Hassankashi");

  6. this.lblPop.Text = "";

  7. this.ListBoxStack.DataSource = objStackPush.ToArray();

  8. this.ListBoxStack.DataBind();

複製代碼

Pop操做

  1. System.Collections.Stack objStackPop = new System.Collections.Stack();

  2.    

  3. objStackPop.Push("Mahsa");

  4. objStackPop.Push("Hassankashi");


  5. //By Pop method you can remove item from the top of the stack --> Last in First in

  6. this.lblPop.Text = objStackPop.Pop().ToString();


  7. this.ListBoxStack.DataSource = objStackPop.ToArray();

  8. this.ListBoxStack.DataBind();

複製代碼


6、Queue

Queue同棧同樣也是具備優先級定義的結構體,遵循的規則是先進先出(FIFO),既不是強類型也不具備固定的大小限制。

入隊操做

  1. //Queue is FIFO: First in First Out

  2. System.Collections.Queue objQueue = new System.Collections.Queue();


  3. //By Enqueue method you can insert item at the END of the Queue

  4. objQueue.Enqueue("Mahsa");

  5. objQueue.Enqueue("Hassankashi");

  6. objQueue.Enqueue("Cosmic");

  7. objQueue.Enqueue("Verse");


  8. this.lblQueue.Text = "";

  9. this.ListBoxQueue.DataSource = objQueue.ToArray();

  10. this.ListBoxQueue.DataBind();

複製代碼

出隊操做

  1. System.Collections.Queue objQueue = new System.Collections.Queue();


  2. objQueue.Enqueue("Mahsa");

  3. objQueue.Enqueue("Hassankashi");

  4. objQueue.Enqueue("Cosmic");

  5. objQueue.Enqueue("Verse");


  6. //By Dequeue method you can remove item from the BEGINING of the Queue --> First in First out FIFO

  7. this.lblQueue.Text=objQueue.Dequeue().ToString();


  8. this.ListBoxQueue.DataSource = objQueue.ToArray();

  9. this.ListBoxQueue.DataBind();

複製代碼

入隊操做

  1. System.Collections.Queue objQueue = new System.Collections.Queue();


  2. objQueue.Enqueue("Mahsa");

  3. objQueue.Enqueue("Hassankashi");

  4. objQueue.Enqueue("Cosmic");

  5. objQueue.Enqueue("Verse");


  6. //By Dequeue method you can remove item from the BEGINING of the Queue --> First in First out FIFO

  7. this.lblQueue.Text=objQueue.Dequeue().ToString();


  8. this.ListBoxQueue.DataSource = objQueue.ToArray();

  9. this.ListBoxQueue.DataBind();

複製代碼


7、List

什麼狀況下須要使用List?

1. List長度可不固定

2. 當數據爲通用類型,List是強類型,List中元素類型不須要等到運行時來肯定,這種特性使得List 運行時效率很是高。

3. 可以使用Foreach關鍵字。

由於List不須要設定固定的大小,List靈活度高,且效率高經常使用於開發過程當中。

  1. //Like Array is Strong Type

  2. //Like ArrayList with No Dimension

  3. System.Collections.Generic.List<string> strList = new List<string>();


  4. strList.Add("Mahsa");

  5. strList.Add("Hassankashi");

  6. strList.Add("Cosmic");

  7. strList.Add("Verse");


  8. this.ListBoxListGeneric.DataSource = strList;

  9. this.ListBoxListGeneric.DataBind();

  10.   

  11. System.Text.StringBuilder str = new System.Text.StringBuilder();


  12. foreach (var item in strList)

  13. {

  14.    str.Append(" , " + item);

  15. }

  16. this.lblList.Text = str.ToString();

複製代碼


8、IList

IList 繼承了List,包含多種方法的List接口。若是你沒法判斷代碼改動的可能性,可使用IList接口,減小模塊之間的依賴性。IList是接口所以沒法被實例化,因此必須使用List來初始化。

  1. //Ilist can not be instantiate from Ilist , so it should be instantiate from List

  2. System.Collections.Generic.IList<string> strIList = new List<string>();


  3. strIList.Add("Mahsa");

  4. strIList.Add("Hassankashi");

  5. strIList.Add("Cosmic");

  6. strIList.Add("Verse");

  7.   

  8. this.ListBoxListGeneric.DataSource = strIList;

  9. this.ListBoxListGeneric.DataBind();

  10.   

  11. System.Text.StringBuilder str = new System.Text.StringBuilder();


  12. foreach (var item in strIList)

  13. {

  14.     str.Append(" , " + item);

  15. }

  16. this.lblList.Text = str.ToString();

複製代碼

咱們一塊兒瞭解一下具體的類和接口之間的區別。

1. 具體類可繼承其餘類,並實現一個或多個接口。

2. 在內部類中能夠定義變量並賦值,接口中不容許此操做。

3. 具體類可包含構造函數,而接口中不能定義構造函數

4. 抽象類中可包含訪問修飾符如public,private等,接口中不能包含。


  1. //IEnumerable can not be instantiate from Enumerable , so it should be instantiate from List

  2.      System.Collections.Generic.IEnumerable<Employee> empIEnumerable = new List<Employee>         {   

  3.          new Employee { ID = 1001, Name="Mahsa"},

  4.          new Employee { ID = 1002, Name = "Hassankashi" },

  5.          new Employee { ID = 1003, Name = "CosmicVerse" },

  6.          new Employee { ID = 1004, Name = "Technical" }

  7.      };


  8.       this.GridViewIEnumerable.DataSource = empIEnumerable;

  9.       this.GridViewIEnumerable.DataBind();


  10.       System.Text.StringBuilder str = new System.Text.StringBuilder();


  11.       foreach (Employee item in empIEnumerable)

  12.       {

  13.     str.Append(" , " + item.ID +"-"+item.Name);

  14.       }

  15.      this.lblIEnumerable.Text = str.ToString();

複製代碼


9、IEnumerable

IEnumerable經常使用於遍歷集合元素,可是沒法修改(刪除或添加)數據,使用IEnumberable 會從服務器端將全部數據拷貝到客戶端,並進行必定的過濾,若是服務器端有大量數據會形成內存負載超重。

  1. //IEnumerable can not be instantiate from Enumerable , so it should be instantiate from List

  2.      System.Collections.Generic.IEnumerable<Employee> empIEnumerable = new List<Employee>         {   

  3.          new Employee { ID = 1001, Name="Mahsa"},

  4.          new Employee { ID = 1002, Name = "Hassankashi" },

  5.          new Employee { ID = 1003, Name = "CosmicVerse" },

  6.          new Employee { ID = 1004, Name = "Technical" }

  7.      };



  8.       this.GridViewIEnumerable.DataSource = empIEnumerable;

  9.       this.GridViewIEnumerable.DataBind();


  10.       System.Text.StringBuilder str = new System.Text.StringBuilder();


  11.       foreach (Employee item in empIEnumerable)

  12.       {

  13.     str.Append(" , " + item.ID +"-"+item.Name);

  14.       }

  15.      this.lblIEnumerable.Text = str.ToString();

複製代碼


10、IQueryable
IQueryable與IEnumberable不一樣的是,當從服務器端加載過量的數據,IQueryable會自動減小應用負載。IQueryable可保證大數據量時應用程序的高性能。IQueryable會先過濾數據,而後發送給客戶端。

  1. DataAccessEntities ctx = new DataAccessEntities();

  2.        var ctx = new DataAccessEntities();

複製代碼




11、SQL Profiler:

如何追蹤查詢語句生成TSQL,生成須要的數據結構體:

Step 1:

  1. Start -> MS SQL Server 2008 -> Performance Tools -> SQL Server Profiler

複製代碼


Step 2:

  1. SQL Server Profiler -> File -> New Trace

複製代碼

Step 3:

輸入鏈接數據庫的用戶名和密碼

Step 4:

  1. General (Tab) -> Use the Template: Standard

複製代碼

Step 5:

  1. Event Selection (Tab) -> Event : TSQL -> Select : SQL-BatchCompleted | Select Show all Columns


  2. Press Column Filter -> Database Name: Like: "DataAccess"

複製代碼

運行

Step 6:

查看結果

Step 7:
生成 IEnumerable數據 :

  1. SELECT 

  2. [Extent1].[ID] AS [ID], 

  3. [Extent1].[Name] AS [Name], 

  4. [Extent1].[Age] AS [Age]

  5. FROM [dbo].[Employee] AS [Extent1]

複製代碼

生成 IQueryable :

  1. SELECT 

  2. [Extent1].[ID] AS [ID], 

  3. [Extent1].[Name] AS [Name], 

  4. [Extent1].[Age] AS [Age]

  5. FROM [dbo].[Employee] AS [Extent1]

  6. WHERE 1 = [Extent1].[ID]

複製代碼

ICollection 繼承了IEnumberable,可是IEnumberable是基於索引的,ICollection不基於索引。

12、Stack Generic

入棧:

  1. //Stack is LIFO: Last in First Out

  2. //Here is for Push Stack in Generic

  3. //System.Collections.Stack objStackPush = new System.Collections.Stack();

  4. //Stack<T> can be instantiated from Stack<T>


  5. System.Collections.Generic.Stack<int> objStackPush = new System.Collections.Generic.Stack<int>();

  6.   

  7. objStackPush.Push(1);

  8. objStackPush.Push(2);

  9.   

  10. this.lblPopGeneric.Text = "";

  11. this.ListBoxStackGeneric.DataSource = objStackPush.ToArray();

  12. this.ListBoxStackGeneric.DataBind();

複製代碼

Queue Generic

入隊:

  1. //Stack is LIFO: Last in First Out

  2. //Here is for Pop Stack in Generic

  3. //System.Collections.Stack objStackPop = new System.Collections.Stack();

  4. //Stack<T> can be instantiated from Stack<T>


  5. System.Collections.Generic.Stack<int> objStackPop = new System.Collections.Generic.Stack<int>();


  6. objStackPop.Push(1);

  7. objStackPop.Push(2);


  8. this.lblPop.Text = objStackPop.Pop().ToString();

  9. this.ListBoxStack.DataSource = objStackPop.ToArray();

  10. this.ListBoxStack.DataBind();

複製代碼

出隊:

  1. //Queue is FIFO: First in First Out

  2. //Here is for Enqueue Queue in Generic

  3. //System.Collections.Queue objQueue = new System.Collections.Queue();

  4. //Queue<T> can be instantiated from Queue<T>

  5. System.Collections.Generic.Queue<int> objQueue = new System.Collections.Generic.Queue<int>();

  6. objQueue.Enqueue(1);

  7. objQueue.Enqueue(2);


  8. this.lblQueue.Text = "";


  9. this.ListBoxQueue.DataSource = objQueue.ToArray();

  10. this.ListBoxQueue.DataBind();

複製代碼

十3、Dictionary 及 IDictionary:
Dictionary 可通用,而哈希表不是通用的。Dictionary定義 <TKey,Tvalue>。IDictionary是Dictionary的接口,若是在後期開發中須要大量修改,建議使用IDictionary。

  1. System.Collections.Generic.Dictionary<int, string=""> objDictionary = new Dictionary<int, string="">();


  2. objDictionary.Add(1001, "Mahsa");

  3. objDictionary.Add(1002, "Hassankashi");

  4. objDictionary.Add(1003, "Cosmicverse");


  5. string str = objDictionary[1002];


  6. this.ListBoxDictionary.DataSource = objDictionary;

  7. this.ListBoxDictionary.DataBind();</int,>

相關文章
相關標籤/搜索