关于CollectionBase抽象类,IEnumerable,IEnumerator以及IComparer,IComparable的实现

来源:互联网 发布:淘宝手机查询等级 编辑:程序博客网 时间:2024/05/18 14:26

最近看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的原理,对一些底层的东西还不是很懂,希望有错误或者有补充的给予意见

0 0
原创粉丝点击