本文介绍了.net集合类型的接口说明与使用,内容比较简单,主要是为了理清思路以及明确集合类型作为参数和返回值时的使用规范,关于集合类型的更多讨论也可以参看:认识.NET的集合。
NET类库提供了丰富的集合数据类型,光System.Collections 命名空间就提供了:列表、队列、位数组、哈希表和字典等多种集合类型。以该命名空间下的集合类型来讲,大体可以分为两类:列表,与字典。前者按照顺序访问集合中的数据,后者提供了键值对的访问方式。
本文主要介绍了列表类型的接口说明和使用上的建议,不涉及.net2.0中的泛型,后者的接口层次与这儿的介绍类似。
接口定义:
IEnumerator
object Current { get; }
bool MoveNext();
void Reset();
IEnumerable
IEnumerator GetEnumerator();
ICollection : IEnumerable
int Count { get; }
bool IsSynchronized { get; }
object SyncRoot { get; }
void CopyTo(Array array, int index);
IList : ICollection, IEnumerable
bool IsFixedSize { get; }
bool IsReadOnly { get; }
object this[int index] { get; set; }
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);
说明:
IEnumerator 提供了遍历数据的方法,在需要依次访问列表中的数据的情况下,使用该接口。
IEnumerable 为foreach操作提供支持,会返回IEnumerator接口对象。
ICollection 提供了条目数量属性,与拷贝到数组的方法,同时提供了线程同步支持。
IList 提供了添加,查找,删除,清空的操作,并支持按索引的访问方式,同时IList具有只读和固定长度属性,如果为只读或固定长度情况下执行新增,删除等操作会引起异常。
使用:
1 作为参数:
如果需要遍历列表,但不需要修改的情况下,优先使用ICollection,因为Collection比Enumerable, Enumerator在名称上更为贴切。同时,Collection提供了Count属性,在不需要遍历的情况下,即可获知列表的条目数量,这在进行一些逻辑判断时,更为有用。
例如:
bool Foo(ICollection list)
{
if (list == null)
throw new ArgumentException("参数不能为空!", "list");
if (list.Count == 0)
{
return false;
}
foreach(object item in list)
{
... option
}
return true;
}
如果需要对列表数据进行修改,查找等操作,使用IList。
2 作为返回值:
如果希望返回一个只读的列表,使用ICollection,反之IList。
在多数情况下,返回IList,因为IList具有更宽的接口,调用者获得一个IList类型的列表后,可以更容易的把该列表再传递给需要:ICollection或IList的函数。