简体   繁体   中英

Implement IEnumerable<T> For a List Wrapper

I have a class, which is just a wrapper over a list, ie,

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

I want to make Wrapper inherits from IEnumerable so that I can use the following syntax:

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

Any idea how to which interface to implement IEnumerable<T> , or IEnumerable , and how to define the method body?

If you implement ICollection<int> you get the desired functionality.

Correction: you actually only need to implement IEnumerable or IEnumerable<T> and have a public Add method in your class:

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

(I also took the liberty of making the TList setter private; it is usually recommended that collection type properties are read-only so that the collection as such can not be substituted by any code outside the type.)

In order to get collection initializers you need to do 2 things:

  1. Implement IEnumerable
  2. Have a method called Add with the correct signature

The preferable way to get these is to implement ICollection, but the minimum you need to do is:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM