你如何实现IEnumerable?

时间:2012-06-22 13:53:49

标签: c# .net linq interface ienumerable

我正在撕掉我的头发。显然你不能只做像

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

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

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

5 个答案:

答案 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 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
}