如何为泛型 class 编写 GetEnumerator()?
How to write GetEnumerator() for a generic class?
我的程序中有一个通用的 class。然后我想在 foreach
循环中使用 class<T>
的实例,但它需要使用 public GetEnumerator
。我如何为 foreach
写一个 GetEnumerator()
?
public class ReadStruct<T> where T : struct
{
MemoryTributary _ms = null;
public ReadStruct(MemoryTributary ms)
{
_ms = ms;
}
public T this[int Index]
{
get
{
if (Index < Count)
return _ms.Read<T>(Index);
return new T();
}
}
public int CountByteToStruct { get { return Marshal.SizeOf(typeof(T)); } }
public long Count { get { return _ms.Length / CountByteToStruct; } }
// it doesn't work!!
public IEnumerator<T> GetEnumerator()
{
return (IEnumerator<T>)this;
}
}
实施IEnumerable<T>
,强制用于foreach
,但这是最佳实践,因此您可以将结构转换为IEnumerable<T>
并获得扩展方法支持:
public class ReadStruct<T> : IEnumerable<T>
where T : struct
然后您可以使用 yield return
实现 GetEnumerator
并重用您的索引器:
public IEnumerator<T> GetEnumerator()
{
var count = Count;
for (var i = 0; i < count; ++i)
yield return this[i];
}
我的程序中有一个通用的 class。然后我想在 foreach
循环中使用 class<T>
的实例,但它需要使用 public GetEnumerator
。我如何为 foreach
写一个 GetEnumerator()
?
public class ReadStruct<T> where T : struct
{
MemoryTributary _ms = null;
public ReadStruct(MemoryTributary ms)
{
_ms = ms;
}
public T this[int Index]
{
get
{
if (Index < Count)
return _ms.Read<T>(Index);
return new T();
}
}
public int CountByteToStruct { get { return Marshal.SizeOf(typeof(T)); } }
public long Count { get { return _ms.Length / CountByteToStruct; } }
// it doesn't work!!
public IEnumerator<T> GetEnumerator()
{
return (IEnumerator<T>)this;
}
}
实施
IEnumerable<T>
,强制用于foreach
,但这是最佳实践,因此您可以将结构转换为IEnumerable<T>
并获得扩展方法支持:public class ReadStruct<T> : IEnumerable<T> where T : struct
然后您可以使用
yield return
实现GetEnumerator
并重用您的索引器:public IEnumerator<T> GetEnumerator() { var count = Count; for (var i = 0; i < count; ++i) yield return this[i]; }