最近看C#语法,快被这几个东西搞混了,终究没能找到Foreach的实现根本原理,感觉现在这个水平也不需要去深究
首先来讲讲对CollectionBase的了解
这个抽象类实现了ICollection,IList,IEnumerable3个接口,其中有一个innerList,List成员为定制实现数组方式访问集合提供方便
public abstract class CollectionBase : IList, ICollection, IEnumerable
{
// Methods
int IList.Add(object value);
void IList.Remove(object value);
// Properties
protected IList List { get; }
}
可调用内部呈List.Add(),List.Remove()实现Add与Remove方法
public desClass this[int index]
{
get
{
return (desClass)List[index];
}
}
实现数组下标访问的功能
/××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××分割线×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
关于IEnumerable接口
只需实现方法IEnumerator GetEnumerator()方法若不定制IEnumerator则使用 yield return 语法返回需要的值(一般为类内的成员变量)
public IEnumerator GetEnumerator()
{
foreach(Class item in CollectionClass)
{
yield return item.desValue;
}
}
若实现IEnumerator接口,则需实现类似C++ Iterator功能
Interface IEnumerator
{
object Current;
public bool MoveNext();
public Reset();
}
那么问题来了为了实现这个接口必须返回一个元素,通过数组下标获取
class IEnumeratorImplement : IEnumerator
{
private List<BaseClass> list=new List<BaseClass>();
private int position=-1;
public object Current
{
get
{ return list[position]; }
}
public IEnumeratorImplement(List<BaseClass> _list)
{
position = -1;
list.AddRange(_list);
}
public bool MoveNext()
{
if (position < list.Count-1)
{
position++;
return true;
}
else
return false;
}
public void Reset()
{
position = -1;
}
}
注意position参数的上下界,可调式程序,若为泛型接口还是先了IDiposable
接下来使用
class CollectionBaseClass
{
List<BaseClass> list=new List<BaseClass>();
public CollectionBaseClass(List<BaseClass> _list)
{
list.AddRange(_list);
}
public IEnumerator GetEnumerator()
{
return new IEnumeratorImplement(this.list);
}
}
此处的举出数据类型可以自行替换,别忘了初始化
/××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
IComparable与IComparer接口的实现相对容易些
IComparable接口只需实现
public int CompareTo(object obj)
{
}
注意判断抛出异常
调用Array.sort(CollectionClass);
IComparer接口实现(在比较对象的代码无法改动时实现IComparer接口较方便)
class Comparer:IComparer
{
public int Compare(object obj1,object obj2)
{
}
}
调用Array.Sort(CollectionClass,new Comparer())
由于无法获取foreach的原理,对一些底层的东西还不是很懂,希望有错误或者有补充的给予意见