当前位置:  开发笔记 > 编程语言 > 正文

你将如何实现IEnumerator接口?

如何解决《你将如何实现IEnumerator接口?》经验,为你挑选了3个好方法。

我有一个将对象映射到对象的类,但与字典不同,它以两种方式映射它们.我现在正在尝试实现迭代值的自定义IEnumerator接口.

public class Mapper : IEnumerable, IEnumerator

{
    C5.TreeDictionary KToTMap = new TreeDictionary();
    C5.HashDictionary TToKMap = new HashDictionary();

    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 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();
    }
}

Jay Bazuzi.. 18

首先,不要让你的集合对象实现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


Pop Catalin.. 7

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

public class Mapper : IEnumerable {
    public IEnumerator GetEnumerator()
    {
        return KToTMap.Values.GetEnumerator();
    }
}

就是这样.



1> Jay Bazuzi..:

首先,不要让你的集合对象实现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



2> Pop Catalin..:

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

public class Mapper : IEnumerable {
    public IEnumerator GetEnumerator()
    {
        return KToTMap.Values.GetEnumerator();
    }
}

就是这样.



3> Jack..:

CreateEnumerable()返回一个IEnumerable实现的GetEnumerator()

public class EasyEnumerable : IEnumerable {

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

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

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

}//class

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有