C#學習筆記(七)—–集合--ICollection和Ilist接口

ICollection和Ilist接口

  • 雖然枚舉接口定義了可以迭代集合的方法,但是它們並沒有定義確定集合元素多少,根據索引訪問集合元素、搜索和修改元素等方法。爲了實現這些功能,.NET Framework定義了IColleciton、IList、IDictionary等接口,這些接口都有相應的泛型等價物,非泛型的存在只是爲了保持向後兼容。這些接口的集成關係如下圖所示(在上一節有,但是爲了方便又拿下來了):
    這裏寫圖片描述
    在這裏對他們進行一個總結:
    ①IEnumerable和IEnumerable<T>:支持最少的功能,只支持枚舉
    ②ICollection和ICollection<T>:支持一般的功能,例如count。
    ③IList和IList<T>以及IDictionary和IDictionary<T>:支持的功能最全面,包括根據索引/鍵實現集合中的元素的隨機訪問。
    提示:但是大多數情況下不需要實現這些接口,我們完全可以使用一個Collection<T>來代替(見下面的“自定義集合和代碼”)。LINQ還提供了一個適合大多數情況的方法。
    對於上面的(除了IEnumerable和他的泛型版本)接口來說,泛型和非泛型的差別很大,特別是對於IColleciton,這其中是有歷史原因的,由於泛型的出現比較晚,而泛型版本是爲了利用泛型的出現而新增的,爲此IColleciton並沒有實現ICollection<T>。這對於IList和IDictionary來說也是一樣的。當然,在通常情況下,可以同時實現這些接口的泛型和非泛型方法。比如說IList,它的泛型版本不擴展它是因爲轉換到IList<T>時會同時出現一個Add<T>(T)和一個Add(object)方法,可能會使用任一類型的參數來調用Add(object)而編譯器不爲所動。因爲這在編譯器理解來說是一種正常的多態行爲。

IColleciton<T>

  • IColleciton<T>是對象可計數集合的標準接口,他提供了很多功能,比如Count、Contains、將集合複製到一個數組 ToArray以及確定集合是否只讀IsReadOnly。對於可寫的集合,可能還需要對集合進行Add、Remove、Clear等操作,另外,由於它實現了IEnumerable<T>,所以可以在實現ICollection<T>的對象上面執行迭代操作。
public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
int Count { get; }
bool Contains (T item);
void CopyTo (T[] array, int arrayIndex);
bool IsReadOnly { get; }
void Add(T item);
bool Remove (T item);
void Clear();
}

非泛型的ICollection只是相當於是提供了一個可計數的集合,它不支持修改集合或成員的功能。

public interface ICollection : IEnumerable
{
int Count { get; }
bool IsSynchronized { get; }
object SyncRoot { get; }
void CopyTo (Array array, int index);
}

非泛型的版本也考慮了一些線程安全性,而泛型的沒有,因爲集合已經不存在線程安全的考慮了。
這兩個接口都是比較容易實現的,如果要實現一個只讀的集合,只需要在Add、Remove、Clear上面拋出異常即可。
這些接口通常與IList和IDictionary一起實現。

IList<T>和IList接口

IList<T>是標準的可按位置索引接口。除了從ICollectioin<T>和IEnumerable<T>繼承的功能,它還實現了按位置(通過一個索引器)讀寫元素和按位置插入和刪除元素。
public interface IList : ICollection, IEnumerable, IEnumerable
{
T this [int index] { get; set; }
int IndexOf (T item);
void Insert (int index, T item);
void RemoveAt (int index);
}
IndexOf方法可以對列表執行線性搜索,如果沒找到結果,會返回-1。
非泛型的IList擁有更多的方法。因爲它繼承了IColleciton的一些方法:

public interface IList : ICollection, IEnumerable
{
object this [int index] { get; set }
bool IsFixedSize { get; }
bool IsReadOnly { get; }
int Add (object value);
void Clear();
bool Contains (object value);
int IndexOf (object value);
void Insert (int index, object value);
void Remove (object value);
void RemoveAt (int index);
}

非泛型的IList接口有一個Add方法,會返回一個int類型,表示新添加的元素的索引,相反,ICollection接口上的Add方法返回一個void。

List<T>是IList和IList<T>的典型實現,C#中的數組也實現了IList和IList<T>,只是添加和刪除元素的功能被顯式的實現並在調用的時候會拋出一個異常,也就是說數組其實只是爲了實現IList的可索引功能。

IReadOnlyList

這個接口用的少,我以後在寫。

發佈了47 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章