I have a class, which is just a wrapper over a list, i.e.,
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?
List implements IEnumerable, but represents the entire collection in memory. LINQ expressions return an enumeration, and by default the expression executes when you iterate through it using a foreach, but you can force it to iterate sooner using .
IEnumerable<T> contains a single method that you must implement when implementing this interface; GetEnumerator, which returns an IEnumerator<T> object. The returned IEnumerator<T> provides the ability to iterate through the collection by exposing a Current property.
IEnumerable is conceptually faster than List because of the deferred execution. Deferred execution makes IEnumerable faster because it only gets the data when needed. Contrary to Lists having the data in-memory all the time.
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:
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>();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With