你将如何实现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#中迭代器的实现及其后果”)是适应速度的好地方。
只需实现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?