class Ranch<T> : IEnumerable<T>
{
// Mad code
IEnumerator<T> GetEnumerator()
{
// Hectic implementation details
}
// More mad code
}
我搜索了互联网,但我找不到一个简单示例,说明如何在任何地方实施该死的东西。甚至是MSDN。这太荒谬了。
关键词有简单。我发现了很多链接,声称告诉我该怎么做然后然后摇摇晃晃,带来大量不必要的和令人讨厌的其他花絮。我想要一个简单的“击倒并运行”代码示例,类似于上面的伪代码的大小和范围。
答案 0 :(得分:4)
要实现IEnumerable<T>
接口,您还必须实现它继承的IEnumerable
接口。
右键单击类签名中的界面,然后选择实现接口,并在类的末尾添加一个骨架:
class Ranch<T> : IEnumerable<T> {
...
#region IEnumerable<T> Members
public IEnumerator<T> GetEnumerator() {
throw new NotImplementedException();
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
throw new NotImplementedException();
}
#endregion
}
只需调用IEnumerable.GetEnumerator
方法即可实现IEnumerable<T>.GetEnumerator
方法:
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
答案 1 :(得分:3)
接口IEnumerable<T>
继承自IEnumerable
并隐藏方法GetEnumerator
。复制自.net来源:
public interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> GetEnumerator(); // hides IEnumerable.GetEnumerator()
}
您还需要显式实现非泛型接口方法IEnumerable GetEnumerator()
:
class Ranch<T>: IEnumerable<T>
{
// Mad code
IEnumerator<T> GetEnumerator()
{
// Hectic implementation details
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
// More mad code
}
答案 2 :(得分:2)
class Ranch<T> : IEnumerable<T>
{
// Mad code
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < 42; ++i)
yield return default(T);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
// More mad code
}
答案 3 :(得分:1)
正如documentation for ienumerable所示,您可以为自定义类实现自己的枚举。或者要覆盖GetEnumerator()
方法本身,您可以查看the documentation for iterators。
实现方法的示例代码:
public System.Collections.IEnumerator GetEnumerator()
{
foreach (object obj in underLyingCollection)
{
yield return obj;
}
}
正如其他人所说,你也必须实施通用(上述)方法。
答案 4 :(得分:1)
Mad Code
是List<T>
的示例。创建类并指定它继承自IEnumerable<T>
后,您可以单击它,然后会出现一个下拉列表Options to implement interface
。单击它,然后选择Implement interface 'IEnumerable<T>'
,它将生成必要的存根。然后你只需填写疯狂的代码。
class Ranch<T>: IEnumerable<T> // <-- click here in VS
{
List<T> _madCode = new List<T>(); // Mad code
IEnumerator<T> GetEnumerator()
{
return _madCode.GetEnumerator(); // Hectic implementation details
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
// More mad code
}