【问题标题】:How do you implement IEnumerable? [closed]你如何实现 IEnumerable? [关闭]
【发布时间】:2012-06-24 19:59:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我很确定它就是这样。除非你用实际的疯狂代码替换 cmets。
  • docs 内置了示例。
  • 你不能这样做是什么意思?你遇到了什么错误? (诚​​然,它应该是公开的或显式的,并且您还需要实现非通用版本)无论如何,框架源代码中有大量示例。 (System.Linq.Enumerable 一个人有很多)
  • @TheIronKnuckle,请更具体地说明您遇到的错误。你的问题真的很糟糕。

标签: c# .net linq interface ienumerable


【解决方案1】:

要实现IEnumerable&lt;T&gt; 接口,您还必须实现它继承的IEnumerable 接口。

右击类签名中的接口,选择Implement Interface,在类的末尾添加一个骨架:

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&lt;T&gt;.GetEnumerator方法即可实现IEnumerable.GetEnumerator方法:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
  return GetEnumerator();
}

【讨论】:

  • 谢谢,我一直在寻找类似的东西!这正是我想要的。我发现的所有其他链接都是过于复杂的废话,将大量其他我不关心的东西带入其中。这是完美的。
  • 这有多完美?一旦你尝试枚举它,你会得到一个异常......这是你想要的吗?
  • 当然不是。这是一个类型检查和编译的框架。我终于可以用它了。
  • @TheIronKnuckle:yield 关键字使得实现可枚举的事情变得微不足道。调查一下。
  • 我知道。我一直想说的是 return new List { Data }.Concat(SubTrees.SelectMany,T>(x => (IEnumerable)x.GetEnumerator()) ).GetEnumerator(); // 不敢相信它花了 4 个小时才通过类型检查器
【解决方案2】:

接口IEnumerable&lt;T&gt;继承自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
}

【讨论】:

  • @TheIronKnuckle: IEnumerable 继承自 IEnumerable ...
  • @TheIronKnuckle:方法IEnumerable&lt;T&gt;.GetEnumerator() 返回IEnumerator&lt;T&gt;,而方法IEnumerable.GetEnumerator() 返回IEnumerator。虽然这两个GetEnumerator() 方法的行为相同并返回一个实现泛型IEnumerator 和非泛型IEnumerator 的对象是很常见的,但是编译器无法知道IEnumerable&lt;T&gt;.GetEnumerator() 返回的对象将实现非泛型IEnumerator -通用IEnumerator,也不是IEnumerable.GetEnumerator()返回的那个将实现IEnumerator&lt;T&gt;。因此需要单独的方法。
【解决方案3】:
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
}

【讨论】:

    【解决方案4】:

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

    实现方法的示例代码:

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

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

    【讨论】:

      【解决方案5】:

      Mad CodeList&lt;T&gt; 的示例。创建类并指定它继承自IEnumerable&lt;T&gt; 后,您可以单击它,然后会出现一个下拉菜单,上面写着Options to implement interface。单击它,然后选择Implement interface 'IEnumerable&lt;T&gt;',它将生成必要的存根。那你就随便填个疯狂的代码吧。

      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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 2014-12-20
        • 2010-09-06
        • 1970-01-01
        相关资源
        最近更新 更多