.net 你將如何實現IEnumerator接口?




c# list (4)

我有一個類將對象映射到對象,但不像字典它映射他們兩種方式。 我現在試圖實現一個自定義的IEnumerator接口,遍歷值。

public class Mapper<K,T> : IEnumerable<T>, IEnumerator<T>

{
    C5.TreeDictionary<K,T> KToTMap = new TreeDictionary<K,T>();
    C5.HashDictionary<T,K> TToKMap = new HashDictionary<T,K>();

    public void Add(K key, T value)
    {
        KToTMap.Add(key, value);
        TToKMap.Add(value, key);

    }

    public int Count
    {
        get { return KToTMap.Count; }
    }


    public K this[T obj]
    {
        get
        {
            return TToKMap[obj];
        }
    }

    public T this[K obj]
    {
        get
        {
            return KToTMap[obj];
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        return KToTMap.Values.GetEnumerator();
    }

    public T Current
    {
        get { throw new NotImplementedException(); }
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    object System.Collections.IEnumerator.Current
    {
        get { throw new NotImplementedException(); }
    }

    public bool MoveNext()
    {
        ;
    }

    public void Reset()
    {
        throw new NotImplementedException();
    }
}

CreateEnumerable()返回一個實現GetEnumerator()IEnumerable

public class EasyEnumerable : IEnumerable<int> {

    IEnumerable<int> CreateEnumerable() {
        yield return 123;
        yield return 456;
        for (int i = 0; i < 6; i++) {
            yield return i;
        }//for
    }//method

    public IEnumerator<int> GetEnumerator() {
        return CreateEnumerable().GetEnumerator();
    }//method

    IEnumerator IEnumerable.GetEnumerator() {
        return CreateEnumerable().GetEnumerator();
    }//method

}//class

只需實現IEnumerable接口,不需要實現IEnumerator,除非你想在枚舉器中做一些特殊的事情,對於你的情況似乎並不需要。

public class Mapper<K,T> : IEnumerable<T> {
    public IEnumerator<T> GetEnumerator()
    {
        return KToTMap.Values.GetEnumerator();
    }
}

就是這樣。


首先,不要讓你的集合對象實現IEnumerator <>。 這導致錯誤。 (考慮兩個線程迭代同一個集合的情況)。

實現一個枚舉器正確的結果是不平凡的,所以C#2.0添加了特殊的語言支持來實現它,這是基於'yield return'語句。

Raymond Chen最近的一系列博文(“在C#中實現迭代器及其後果”)是一個很好的起步點。






collections