C#的集合相信的大家用的最多的类型之一,但是我之前除了几个常用的,对与其他的集合类型都不太了解,所以特意写一篇帖子,梳理自己的知识。
数组:数组是相同数据类型的元素按一定顺序排列的集合
优点:在内存中连续存储,便于元素的便利
缺点:但正是这样的结构,使其插入数据非常麻烦,而且数组声明时必须执行长度,容易造成空间浪费
集合:针对数组的这些缺点,C#中最先提供了ArrayList对象来克服这些缺点
ArrayList:
优点:可根据添加的元素,动态执行大小,对元素的一些基本操作,比如,插入,移除都有定义,使用比较方便,
缺点:但是存放类型为object,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的,而且每次使用元素都要经历装箱拆箱操作,很损耗性能
所以,出现了泛型集合List< T>
System.Collections
这个命名空间包含接口和类定义各种对象,如列表、 队列、 位数组、 哈希表和字典集合,这个命名空间内的类型都是非泛型
System.Collections.Generic
这个命名空间包含定义泛型集合的接口和类,用户可以使用泛型集合来创建强类型集合,这种集合能提供比非泛型强类型集合更好的类型安全性和性能
FCL中提供了几个接口,只列举基本的接口,泛型就不写了
公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代
IEnumerable中只有一个方法,就是获取迭代器
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
支持在泛型集合上进行简单迭代,让我们能够依次访问集合的每一个元素
IEnumerator是最基本的迭代器接口
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
实际就是IEnumerable提供最基础的提供迭代器的方法,ICollection在它的基础上封装了对集合操作的的基础方法,其他的集合接口都是基于这两个类的基础上进行再封装,添加更多的功能
下面,这段代码,是我自己写的一个结合类,继承自IEnumerable,模拟List的功能
public class CustonList : IEnumerable
{
public T[] array;
private int length;
private int index;
public CustonList()
{
length = 8;
index = -1;
array = new T[length];
}
public void Add(T item)
{
index++;
if (index >= array.Length)
{
EnlargeArray();
}
array[index] = item;
}
public void Remove(T item)
{
if (array.Length > 0)
{
T[] newArray = new T[array.Length];
int newIndex = 0;
foreach (T temp in array)
{
if(!temp.Equals(item))
{
newArray[newIndex] = temp;
newIndex++;
}
}
array = newArray;
}
}
//数组扩容,每次增加length定义的大小
private void EnlargeArray()
{
T[] newArray = new T[array.Length + length];
Array.Copy(array, newArray, array.Length);
array = newArray;
}
public IEnumerator GetEnumerator()
{
foreach (T item in array)
{
if (item == null)
{
break;
}
yield return item;
}
}
}
定义所有非泛型集合的大小、枚举数和同步方法。
public interface ICollection : IEnumerable
{
int Count { get; }
bool IsSynchronized { get; }
object SyncRoot { get; }
void CopyTo(Array array, int index);
}
表示可按照索引单独访问的对象的集合,提供了操作集合的一些基础方法
public interface IList : ICollection, IEnumerable
{
object this[int index] { get; set; }
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);
}
定义类型为比较两个对象而实现的方法
定义用于支持比较对象是否相等的方法
提供用于集的抽象的基接口,只有泛型接口
我会在我的公众号上推送新的博文,也可以帮大家解答问题
微信公众号 Andy and Unity 搜索名称或扫描二维码
希望我们能共同成长,共同进步