2.1. List

IDisposable

void Dispose();

IEnumerator:IDisposable

bool MoveNext();
void Reset();
object Current{get;}

IEnumerator:IEumerator

new Current{get;}

IEnumerable

IEnumerator GetEnumerator();

IEumerable:IEumerable

new IEumerator<T> GetEnumerator();

ICollection:IEumerable

void CopyTo(Array array,int index);
int Count{get;}
Object SyncRoot{get;}
bool IsSynchronized{get;}

ICollection:IEumerable

// base intreface for all collections,defining enumerator,size,and synchronization methods

int Count{get;}
bool IsReadOnly{get}
void Add(T item);
void Clear();
bool Contains(T item);
// copyto copies a collection into an array,starting at a paricular index into the array
void CopyTo(T[] array,int arrayIndex);    
bool Remove(T item);

IList:ICollection

Object this[int index]{get;set;}
int Add(Object value);
bool Contains(Object value);
void Clear();
bool IsReadOnly{get;}
bool IsFixedSize{get;}
int IndexOf(Object value);
void Insert(int index,Object vlaue);
void Remove(Object value);
void RemoveAt(int index);

IList:IColleciton

//提供索引访问
T this[int index]{get;set;}
int IndexOf(T item);
//inserts value into the list at postion index
void Insert(int index,T item);
void RemoveAt(int index);

IReadOnlyCollection:IEnumerable

int Count{get;}

IReadOnlyList

T this[int index]{get;}

IComparer 对象实现比较查询的是否非常重要的一个接口

int Compare(T x,T y);

IEqualityComparer

bool Equals(Object x,Object y);
int GetHashCode(Object obj);

IEqualityComparer

bool Equals(T x,T y);
int GetHashCode(T obj);

List:IList,IList,IReadOnlyList

1400行,中等复杂
private T[] _items;
private int _size,_version,_syncRoot;  //Capacity内部数组_items[]的当前分配的长度
private static readonly T[] _emptyArray=new T[0]; 
public int Count{get{return _size;}}  //_size和Count是_items[]实际存储的元素个数,并不是分配的个数
pubilc int Capacity{get;set;} //不要手动设置Capacity>0,每次修改都会引发旧数组复制到新数组,重新分配新的内存长度,建立新的数组并赋值给items。设置<=0将清空_items

private bool IsSynchronize{get{return false;}} //非线程安全

Add(T item){}; //1. 检查capacity 2.size的话自增,size可以从0自增(没有数据),或者用ICollection初始化就从那个基础上增加

BinarySearch(T item){} //O(lgn)

InsertRange(int index,IEumerable<T> collection){} //它最奇怪的是不用简单的迭代器,而选择使用ICollection.CopyTo(),应该是CopyTo的效率比迭代器好

Contians(T item);// 这里有个细节是它没有使用==来判断非空对象而是调用了Equals(),这样写应该好处更多,只在null的时候才被迫使用==进行判断

CopyTo(); //内部使用Array.Copy 将内置的_items拷贝到array参数中

Find()/FindAll(){};  //只是使用了for循环而已,逐条判断

FindIndex(){}; //循环

FindLast(){};  //倒过来循环

ForEach(Action<T> action){};  //判断如果是.net4.5以上使用for循环执行action,不是并发,就是一种foreach的封装,估计是历史遗留代码,很鸡肋

GetRange(int index,int count){}; //使用不是逐条insert这种垃圾写法,用的是Array.Copy()  newlist._items ,也只有类内部可以这样调用,外部的话可以用CopyTo

RemoveAt(int index){}; //原数组复制,去掉中间的那个数据,Array.Copy(_items,index+1,_items,index,_size-index);并且把最后一位设置成default(T)
posted @ 2017-10-19 21:36  给我一个理由  阅读(229)  评论(0编辑  收藏  举报