【问题标题】:Implement IEnumerable<T> For a List Wrapper为列表包装器实现 IEnumerable<T>
【发布时间】:2009-12-12 08:28:01
【问题描述】:

我有一个类,它只是一个列表的包装器,即,

public class Wrapper
{
   public List<int> TList
   {get;set;}
   public Wrapper()
   {
      TList=new List<int>();
   }
}

我想让Wrapper 继承自 IEnumerable 以便我可以使用以下语法:

Wrapper wrapper = new Wrapper()
                       {
                         2,4,3,6 
                       };

知道如何实现IEnumerable&lt;T&gt;IEnumerable的接口,以及如何定义方法体吗?

【问题讨论】:

  • 不,使用 IEnumerable 将无法正常工作。我认为你必须实现 ICollection.
  • 不,deerchao,它需要IEnumerable。我们不要求 ICollection,当然,这样做是明智的。

标签: c# ienumerable


【解决方案1】:

如果您实现ICollection&lt;int&gt;,您将获得所需的功能。

更正:您实际上只需要实现IEnumerableIEnumerable&lt;T&gt; 并在您的类中有一个公共的Add 方法:

public class Wrapper : IEnumerable<int>
{
    public List<int> TList
    { get; private set; }
    public Wrapper()
    {
        TList = new List<int>();
    }

    public void Add(int item)
    {
        TList.Add(item);
    }
    public IEnumerator<int> GetEnumerator()
    {
        return TList.GetEnumerator();
    }

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

(我还冒昧地将TList setter 设为私有;通常建议集合类型属性为只读,这样集合本身就不能被该类型之外的任何代码替换。)

【讨论】:

  • 为什么我们需要同时实现通用和非通用版本的 GetEnumerator?
  • @hdgarrood 这是必要的,因为IEnumerable&lt;T&gt; 继承了IEnumerable,这不是通用的。实现了IEnumerable&lt;T&gt; 的类型也实现了IEnumerable,因此这些方法也需要存在。
  • 所以我不能在技术上做 wrapperInstance.TList.Add() 并添加一个项目而不调用你的 Add wrapper 还是我错过了什么?
  • @David 拨打wrapperInstance.TList.Add 没有问题。 Wrapper.Add 方法是列表初始化构造 (var x = new Wrapper { 1, 2, 3 }) 工作所必需的。
【解决方案2】:

为了获得集合初始化器,您需要做 2 件事:

  1. 实现 IEnumerable
  2. 有一个名为 Add 且签名正确的方法

最好的方法是实现 ICollection,但您需要做的最低限度是:

public class Wrapper : IEnumerable<int>
{
    public List<int> TList
    {get;set;}

    public IEnumerator<int> GetEnumerator()
    {
        return TList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() // Explicitly implement the non-generic version.
    {
        return TList.GetEnumerator();
    }

    public void Add(int i)
    {
         TList.Add(i);
    }

    public Wrapper()
    {
        TList=new List<int>();
    }
}

【讨论】:

    猜你喜欢
    • 2014-12-04
    • 2011-05-15
    • 2011-07-29
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多