你将如何实现IEnumerator接口?

我有一个将对象映射到对象的类,但与字典不同,它将它们映射到两个方向。 我现在试图实现一个自定义的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();
    }
}

首先,不要让你的集合对象实现IEnumerator <>。 这导致错误。 (考虑两个线程迭代同一个集合的情况)。

实现一个枚举器正确的结果是不平凡的,所以C#2.0基于'yield return'语句添加了特殊语言支持。

Raymond Chen最近的一系列博客文章(“C#中迭代器的实现及其后果”)是适应速度的好地方。

  • 第1部分:http://blogs.msdn.com/oldnewthing/archive/2008/08/12/8849519.aspx
  • 第2部分:http://blogs.msdn.com/oldnewthing/archive/2008/08/13/8854601.aspx
  • 第3部分:http://blogs.msdn.com/oldnewthing/archive/2008/08/14/8862242.aspx
  • 第4部分:http://blogs.msdn.com/oldnewthing/archive/2008/08/15/8868267.aspx

  • 只需实现IEnumerable接口,不需要实现IEnumerator,除非你想在枚举器中做一些特殊的事情,对于你的情况似乎并不需要。

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

    就是这样。


    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
    
    链接地址: http://www.djcxy.com/p/9113.html

    上一篇: How would you implement the IEnumerator interface?

    下一篇: When to use Yield?