That classic question: List<T> or IEnumerable<T> in C#?

Straight to the point:

  • IEnumerable<T>: when you only need forward iteration. It also works with deferred execution, the basis of LINQ and ideal for handling large amounts of data without loading everything into memory.
  • ICollection<T>: in addition to iteration, it allows you to add, remove, and count items, but without index access.
  • IList<T>: includes everything from ICollection<T>, plus index-based access and the ability to insert/remove at specific positions.
  • List<T>: the concrete implementation of IList<T>, the class you usually use to instantiate a list.

Why does this matter?

Whenever possible, use the minimal required interface. Clear contracts reduce coupling and make your code more flexible and easier to maintain.


👉 Adapted from my original post on LinkedIn .