代码之家  ›  专栏  ›  技术社区  ›  Graviton

为列表包装器实现IEnumerable<t>

  •  10
  • Graviton  · 技术社区  · 15 年前

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

    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<T> IEnumerable 以及如何定义方法体?

    2 回复  |  直到 15 年前
        1
  •  33
  •   Fredrik Mörk    15 年前

    如果你实施 ICollection<int> 您可以获得所需的功能。

    更正:您实际上只需要实现 IEnumerable IEnumerable<T> 有一个公众 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 private;通常建议集合类型属性是只读的,这样集合就不能被类型之外的任何代码替换。)

        2
  •  9
  •   ICR    15 年前

    要获取集合初始值设定项,需要执行两项操作:

    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>();
        }
    }