C#陣列教程之3

大可山發表於2009-02-24

C#陣列教程

(續前《C#陣列教程之2》)
第一篇:C#陣列教程
第二篇:C#陣列教程之2

IEnumerable 介面:公開列舉數,該列舉數支援在非泛型集合上進行簡單迭代。

違規廣告ection 介面擴充套件 IEnumerable;

[ComVisibleAttribute(true)] 

public interface 違規廣告ection : IEnumerable

{

 //增加了公共屬性:Count,IsSynchronized和SyncRoot

 //增加了公共方法:CopyTo()

}

IDictionary 和 IList 則是擴充套件 違規廣告ection 的更為專用的介面。

IDictionary 實現是鍵/值對的集合,如 Hashtable 類。

[ComVisibleAttribute(true)] 

public interface IDictionary : 違規廣告ection, IEnumerable

{

 //公共屬性: IsFixedSize, IsReadOnly, Item, Keys, Values

 //公共方法:Add, Clear, Contains, GetEnumerator,Remove

}

某些集合(如 Queue 類和 Stack 類)限制對其元素的訪問,它們直接實現 違規廣告ection 介面。

如果 IDictionary 介面和 IList 介面都不能滿足所需集合的要求,則從 違規廣告ection 介面派生新集合類以提高靈活性。

例如:

// 假設MessageSet是變數集合。

IEnumerator enumerator = MessageSet.GetEnumerator(); 

string nextMessage;

enumerator.MoveNext();

while ( (nextMessage = enumerator.Current) != null)

{

 DoSomething(nextMessage);   // We only have read access

 // to NextMessage

 enumerator.MoveNext();

}

融會貫通:

using System;

using System.Collections;

public class Person

{

    public Person(string fName, string lName)

    {

        this.firstName = fName;

        this.lastName = lName;

    }

    public string firstName;

    public string lastName;

}

public class People : IEnumerable

{

    private Person[] _people;

    public People(Person[] pArray)

    {

        _people = new Person[pArray.Length];

        for (int i = 0; i 

        {

            _people[i] = pArray[i];

        }

    }

    public IEnumerator GetEnumerator()

    {

        return new PeopleEnum(_people);

    }

}

public class PeopleEnum : IEnumerator

{

    public Person[] _people;

    // Enumerators are positioned before the first element

    // until the first MoveNext() call.

    int position = -1;

    public PeopleEnum(Person[] list)

    {

        _people = list;

    }

    public bool MoveNext()

    {

        position++;

        return (position 

    }

    public void Reset()

    {

        position = -1;

    }

    public object Current

    {

        get

        {

            try

            {

                return _people[position];

            }

            catch (IndexOutOfRangeException)

            {

                throw new InvalidOperationException();

            }

        }

    }

}

class App

{

    static void Main()

    {

        Person[] peopleArray = new Person[3]

        {

            new Person("John", "Smith"),

            new Person("Jim", "Johnson"),

            new Person("Sue", "Rabon"),

        };

        People peopleList = new People(peopleArray);

        foreach (Person p in peopleList)

            Console.WriteLine(p.firstName + " " + p.lastName);

    }

}

III、探討部分

C# []、Array、List、ArrayList 區別

[] 是針對特定型別、固定長度的。

Array 是針對任意型別、固定長度的。

List 是針對特定型別、任意長度的。

ArrayList 是針對任意型別、任意長度的。ArrayList 是陣列的複雜版本。ArrayList 類提供在大多數 Collections 類中提供但不在 Array 類中提供的一些功能。

例如:

Array 的容量是固定的,而 ArrayList 的容量是根據需要自動擴充套件的。

如果更改了 ArrayList.Capacity 屬性的值,則自動進行記憶體重新分配和元素複製。 

ArrayList 提供新增、插入或移除某一範圍元素的方法。

在 Array 中,您只能一次獲取或設定一個元素的值。 

使用 Synchronized 方法可以很容易地建立 ArrayList 的同步版本。

而 Array 將一直保持它直到使用者實現同步為止。 

ArrayList 提供將只讀和固定大小包裝返回到集合的方法。而 Array 不提供。 

另一方面,Array 提供 ArrayList 所不具有的某些靈活性。例如:

可以設定 Array 的下限,但 ArrayList 的下限始終為零。 

Array 可以具有多個維度,而 ArrayList 始終只是一維的。

特定型別(不包括 Object)的 Array 的效能比 ArrayList 好

這是因為 ArrayList 的元素屬於 Object 型別,所以在儲存或檢索值型別時通常發生裝箱和取消裝箱。

要求一個陣列的大多數情況也可以代之以使用 ArrayList。

它更易於使用,並且通常具有與 Object 型別的陣列類似的效能。 

Array 位於 System 名稱空間中;ArrayList 位於 System.Collections 名稱空間中。

其他資料集合:(以後課程介紹)

1、 Stack類,Queue類

2、 SortedList類

3、 Hashtable類

4、 泛型:位於System.Collections.Generic中,可以訪問Stack, Queue, List, Dictionary, SortedDictionary等的泛型版本。

IV.思考題:

1、 撲克牌有54張,使用現有知識模擬一幅撲克牌的例項,嘗試打亂撲克的順序(類似洗牌過程)。[基礎]

2、選擇題:[基礎]

int[,,] num1 = new int[2, a, b] {

{ { 1, 2, 3 },{ 4, 5, 6 } },

{ { 7, 8, 9 },{10,11,12} }

};

int[,,] num2 = new int[2, c, d] {

 { { 1, 2, 3 },{ 4, 5, 6 }, { 7, 8, 9 },{10,11,12}},

 { {13,14,15},{16,17,18},{19,20,21},{22,23,24} }

};

(1)其中:a,b,c,d的值分別應該是:

A. 2,3,3,4   B. 2,3,4,3   C.3,2,3,4  D.3,2,4,3

(2)num1.Length, num1.GetLength(1)及num2.Length,num2.GetLength(1)的值分別是:

A. 12,2,24,4     B. 12,3,24,3    C. 6,2,12,3    D. 3,2,3,3

3、 模擬上述撲克牌的洗牌及發牌過程(以鬥地主為例)。[中高]

4、 如果有54張圖片,你可以在第2題的基礎上寫出一個完整的鬥地主遊戲嗎?[高階]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14601556/viewspace-557620/,如需轉載,請註明出處,否則將追究法律責任。

相關文章