-4

我在扯头发。显然你不能只做类似的事情

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

我搜索了互联网,但找不到一个简单的例子来说明如何在任何地方实现该死的东西。甚至 MSDN。这太荒谬了。

有简单的关键词。我发现很多链接声称告诉我如何做,然后继续漫无目的,带来大量不必要和烦人的其他花絮。我想要一个简单的“打掉它并运行”代码示例,它与上述伪代码的大小和范围。

4

5 回答 5

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();
}
于 2012-06-22T13:59:31.140 回答
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
}
于 2012-06-22T13:59:56.163 回答
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
}
于 2012-06-22T14:07:01.073 回答
1

正如ienumerable 的文档所示,您可以为自定义类实现自己的 Enum。或者要覆盖GetEnumerator()方法本身,您可以查看iterators 的文档

实现方法的示例代码:

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

正如其他人所说,您还必须实现通用(上述)方法。

于 2012-06-22T14:00:17.393 回答
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
}
于 2012-06-22T14:04:22.737 回答