2012-06-22 101 views
-4

我正在撕裂我的头发。显然,你不能这样做你如何实现IEnumerable?

class Ranch<T> : IEnumerable<T> 
{ 
    // Mad code 
    IEnumerator<T> GetEnumerator() 
    { 
     // Hectic implementation details 
    } 
    // More mad code 
} 

我在网上搜索,我无法找到如何实现任何地方该死的东西一简单例子。甚至MSDN。这很荒谬。

关键词有简单。我发现很多链接声称告诉我该怎么做,然后随意乱转,带来不必要的和令人讨厌的其他花絮堆积。我想要一个简单的“打倒它并运行”的代码示例,它类似于大小和范围到上面的伪代码。

+9

我敢肯定,这正是它是什么。除了用实际的疯狂代码替换注释。 – BoltClock

+1

[docs](http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx)内置示例。 – NominSim

+0

你是什么意思,你不能这么做?你遇到了什么错误? (敬请注意,它应该是公开的或明确的,并且您还需要实现非通用版本)。在任何情况下,框架源代码中都包含*吨*的示例。 ('System.Linq.Enumerable'单独有很多) –

回答

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

非常感谢,我一直在寻找这样的东西!这正是我想要的。我发现的所有其他链接都是过分复杂的垃圾,它带来了其他东西堆,我不在乎。太棒了。 – TheIronKnuckle

+0

那是完美的吗?一旦你尝试枚举它,你会得到一个例外......那是你想要的吗? – SimpleVar

+1

当然不是。这是一个类型检查和编译的框架。我终于可以用这个工作了。 – TheIronKnuckle

3

接口从IEnumerableIEnumerable<T>继承和隐藏方法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 
} 
+0

我不知道为什么,虽然XD – TheIronKnuckle

+0

@TheIronKnuckle:自IEnumerable ... – Stefan

+1

@TheIronKnuckle的IEnumerable 继承:该方法'的IEnumerable .GetEnumerator()''返回的IEnumerator ','同时该方法IEnumerable.GetEnumerator() '返回'IEnumerator'。尽管两个GetEnumerator()方法的行为是相同的,并且返回一个实现了通用的“IEnumerator”和非泛型的“IEnumerator”的对象,但编译器无法知道由IEnumerable 返回的对象。 GetEnumerator()'将实现非泛型'IEnumerator',也不会由'IEnumerable.GetEnumerator()'返回的实现'IEnumerator '。因此需要单独的方法。 – supercat

1

由于documentation for ienumerable显示,你可以实现自己的枚举为您的自定义类。或者覆盖GetEnumerator()方法本身,你可以看看the documentation for iterators。用于实施方法

示例代码:

public System.Collections.IEnumerator GetEnumerator() 
{ 
    foreach (object obj in underLyingCollection) 
    { 
     yield return obj; 
    } 
} 

正如其他人指出你必须实现通用的(上文)的方法为好。

1

其中Mad CodeList<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 
} 
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 
}