Friday, July 27, 2012

IEnumerable, ICollection, IList Compared


IEnumerable<> => Allows use of 'foreach' on a collection
ICollection<>    => As IEnumerable<> + Add(), Remove(), Count, Clear(), Contains(), IsReadOnly, CopyTo()
IList<> => As ICollection<> + this[int], Insert(), IndexOf(), RemoveAt(). ie. It adds indexing type list operators

· Can use 'return yield ???' in conjunction with IEnumerable<> to only return 1 object at a time. This is where the real power of IEnumerable comes from (not from simply returning a list or an array).
· When returning a list decide what can be exposed to the user and return the appropriate type. 
· Maybe its best to return an ICollection<> or IList<> and if the code client only needs to enumerate the list they can cast it to an IEnumerable<>. ie. Given ICollection<Widgets> SomeMethod() … The user could invoke it as IEnumerable<Widgets> widgets = SomeMethod()

You can get the full scoop in this post, but a quick summary is as follows:
§ System.Collections.IEnumerable (Provides enumerator)
· System.Collections.ICollection (Adds Size, ToArray, and Sync)
System.Collections.IList (Adds Integer Index capabilities)
· System.Collections.IDictionary (No indexing by integer -- instead offers indexing by Key)
§ System.Collections.Specialized.IOrderedDictionary

public interface IEnumerable
§ Members:
· Properties: (none)
· Methods: (GetEnumerator)
§ Descendents:
§ Notes:
· This is the most basic interface that sets up a class to be iterated over.
public interface ICollection : IEnumerable
§ Members:
· Properties: ( Count, IsSynchronized, SyncRoot)
· Methods: ( CopyTo, GetEnumerator)
§ Interface Descendents: (IList, IDictionary, IOrderedDictionary)
§ Notes:
· Takes IEnumerable a bit further to be the foundation for a Collections of items that can be iterated over, but not necessarily gotten to by index.
public interface IList : ICollection, IEnumerable
§ Members:
§ Interface Descendents:
§ Notes:
· Now we're starting to get somewhere...we can iterate over the items, and get to them by index if we have to.
public interface IDictionary : ICollection, IEnumerable
§ Members:
· Methods: (Add, Clear, Contains, CopyTo, GetEnumerator,Remove)
§ Interface Descendents:
§ Note:
· Very similar to IList, but instead of working with items by position, is meant to be used to get at them via a key.
· But Different to IList in the fact that it does not have Insert or RemoveAt

No comments: