這本書討論了使用C#實現數據結構及算法。在.Net Framework的System.Collections類庫中可以找到本書所使用的數據結構。在這一章,首先通過講述自己編寫的一個集合類(使用數組為基礎來實現),進而涵蓋.Net Framework裡的集合類,以此來深入地闡述集合的概念。
泛型是C# 2.0中新增的一個重要的概念。泛型允許C#開發人員單獨或在一個類中編寫方法時,無需重載這個方法,就可以在方法中處理不同的數據類型。C# 2.0提供了一個特殊的類庫,System.Collections.Generic,在這個類庫中實現了System.Collections類庫中的幾個數據結構的范型版本。
最後,本章介紹了一個自定義類,計時器類。它將在幾個章節中用於測量數據結構或算法的性能。這個類將用於替代大O表示法,這並不意味著大O表示法不重要,僅僅是因為本書更注重數據結構和算法的實用性。
集合是一種數據結構,它存儲數據,並提供了向集合中添加、刪除、修改數據和在集合中設置並返回不同屬性值的操作。
集合可以分為兩種類型:線性的和非線性的。一個線性集合是包含了一組彼此相鄰的元素的表。線性集合中的元素通常按位置進行排序(1、2、3等等)。在現實世界中,貨物清單是一個非常好的線性集合的例子;在計算機世界中(也是真實的),數組被設計為線性集合。
非線性表中的每個元素並非按順序排列。組織系統圖(原文是organizational chart這個東西不是很了解,不知道翻譯是否正確)是一個非線性集合的例子,好比球架裡的台球。在計算機世界裡,樹、堆、圖和sets(sets不知道是什麼,這裡使用原文,看到後面再回來改吧)都是非線性集合。
集合,不管是線性的還是非線性的,都定義了一系列的屬性和操作。例如,集合中的Count屬性,控制著集合中項目的個數。集合的操作叫做方法,包括Add(向集合中添加一個新的元素),Insert(在集合的指定索引處添加一個新的元素),Remove(從集合中移除指定的元素),Clear(移除集合中的所有元素),Contains(確定集合中是否包含指定的元素)和IndexOf(確定指定元素在一個集合中的索引號)。
集合中的兩個主要類別中又包含了幾個子類別。線性集合可以是直接存取集合或順序存取集合,而非線性集合可以是分級的或分組的。下對這些集合進行一一講述。
(這本書對數據結構的分類跟國內的一般書籍有很大的不同,有些術語根本沒有見過,在網上也找不到,但還是先按原意進行翻譯,等譯完整本書後再討論這個問題)
最普通的直接存取集合的例子是數組。如圖1.1所示,我們定義了一個數組,它的所有元素都有相同的數據類型,並且通過一個整數類型的索引可以直接訪問集合內的每一個元素。
Item 0
Item n-1
Item 2
Item 3
···
Item j
數組可以是靜態的,這樣在程序中,數組被聲明並確定長度後,就已經指定了元素的個數,它們也可以是動態的,這樣數組的元素個數可以通過重新聲明數組或改變它的存儲區域來動態更改。(原文是or they can be dynamic, where the number of elements can be increased via the ReDim or ReDim Preserve statements.無法得知ReDim是什麼意思,也不知道Preserve statements所指的是什麼。原作者寫過很多本書VB.Net的書,包括用VB.Net實現數據結構,這本書估計也是從VB.Net版的數據結構轉化過來,猜測ReDim是VB裡的東西,因為Dim在VB裡用於聲明)。
在C#中數組不但做為一種數據類型,而且是一個類。在本章稍後,在進一步研究如何使用數組時,我們將討論如何把數組當做一個類來使用。
我們可以使用數組來存儲線性集合。在數組中添加一個新元素非常容易,只需簡單地在數組後方的空白區域的前端添加一個元素即可。在數組中添加一個元素就沒有這麼容易(或有效率)了,因為我們不得不向下移動數組元素以騰出空間給即將插入的元素。刪除數組中的最後一個元素也非常有效率,因為我們只需簡單地把最後一個元素刪除。刪除數組中的其他位置的元素的效率就相對低一些,因為和插入數據一樣,為了保證數組中的每個元素彼此相鄰,不得不把很多元素向上移動一格。在本章稍後將討論這些問題。.Net Frmaework為了更容易地使用線性集合,提供了一個特殊的數組類—ArrayList,我們將在第3章討論這個類。
另外一種類型的直接存取集合是字符串。字符串是由多個可以通過索引來訪問的字符組成的集合,這跟訪問數組元素的方式是一樣的。在C#中,字符串也是一個類,這個類包含了很多的方法可以執行對字符串進行的標准操作,如果連接字符串,返回子串,插入字符,刪除字符等等。我們將在第8章討論字符串類。
C#的字符串是不可變的,這意味著當一個字符串被初始化後,它將不能被改變。當你改變一個字符串時,一個字符串的拷貝將被創建,而不是改變原來的字符串。在某些情況下,這種行為將導致性能的下降,所以.Net Frmaework提供了StringBuilder類來讓你操作易變的字符串。我們將在第8章討論StringBuilder類。
最後一個直接存取集合類型是struct(譯為“結構體”,在其他語言中也被稱做structures或records)。Struct是一種可以由多種數據類型組合而成的數據類型。比如,一個員工記錄包括員工姓名(字符串),薪水(整數),員工號(字符串或整數)等等屬性。如果把它們存放在不同的變量內將使程序變得非常混亂,C#語言提供了struct類型用於存放這一類數據。
C#中的struct數據類型的一個強大的功能是可以定義方法來操作存儲在struct中的數據。這使得結構體在某些時候看上去像類,但你不能通過繼承struct來生成一個新的類型。以下代碼演示了一個簡單的struct應用。
using System;
public struct Name
{
private string fname,mname,lname;
public Name(string first,string middle,string last)
{
fname=first;
mname=middle;
&nb
(編者是VB方面的專家,但從這段代碼可以發現,他對C#並不是很熟,屬性代碼寫錯,雖然可以通過編譯,但對屬性賦值時無法更改屬性值。編者之前寫過一本《Data Structures and Algorithms Using Visual Basic.NET》或許這些代碼只是簡單地從VB.Net轉化成C#直接使用在這本書上,並且沒有仔細檢查)。
待續。。。。。