我有一个将对象映射到对象的类,但与字典不同,它以两种方式映射它们.我现在正在尝试实现迭代值的自定义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(); } }
就是这样.
首先,不要让你的集合对象实现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: IEnumerable { public IEnumerator GetEnumerator() { return KToTMap.Values.GetEnumerator(); } }
就是这样.
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