IQueryable
:
- Query isn’t executed until you really iterate over the items, maybe by doing a
.ToList()
or aforeach
. Which means you still can add filters, like aWhere()
. - Extends IEnumerable
IEnumerable
:
- Forward-only list of items. You can’t get at “item 4” without passing items 0-3.
- Read-only list, you can’t add to it or remove from it.
- Still might use deferred execution (IQueryable is still an IEnumerable).
IList
:
- Random access to the full list
- Probably entirely in memory (no deferred execution, but who knows what the exact class does that implements this?)
- Supports adding and removing
- Extends IEnumerable and ICollection
ICollection
:
- Is between IEnumerable and IList.
- Extends IEnumerable
What is “best” depends on your requirements. Usually though an IEnumerable is “good enough” if you only want to display items. At least always use the generic variant.