Про интерфейсы IEnumerable и IQueryable
почитай мой ответ тут.
Интерфейс ICollection наследуется от IEnumerable и подразумевает, что реализующие его классы умеют эффективно вставлять и удалять элементы.
Интерфейс IList наследуется от ICollection и подразумевает, что реализующие его классы умеют предоставлять доступ к элементу по индексу.
List это конкретный класс, который реализует интерфейсы IList, ICollection т.е. подразумевается, что он умеет эффективно вставлять/удалять и давать доступ по индексу.
Попробую на пальцах когда и что использовать...
Функция получает:
IEnumerable - подразумевается, что ты только перебираешь элементы.
IQueryable - клиентам придется попотеть что бы ты мог дополнить дерево выражений, что бы обеспечить более точный запрос.
ICollection - ты уверен, что хочешь что то добавить или удалить в коллекции в этой функции ? Один из звоночков, что с архитектурой могут быть проблемы.
IList - а ты уверен что тебе очень критично иметь доступ по индексу в этой функции ? Второй звоночек про архитектуру.
List - работаю только со списками и не пытайтесь дать мне другой контейнер.
Функция возвращает:
IEnumerable - никаких обещаний, пусть клиенты рассчитывают только на перебор.
IQueryable в функции запрос (например к дб) фактически не выполняется и клиенты могут попытаться его дополнить условиями, что бы с базы шло меньше данных.
ICollection - ты возвращаешь коллекцию путь кто хочет тот и добавляет и удаляет в ней элементы.
IList - ты уже создал в функции соответствующую коллекцию, возможно кому то понадобится доступ по индексу.
List - да мне наc..ть на интерфейсы создал список - отдал список и я всегда буду создавать список, даже если мне потребуется создать последовательность из 100500 миллионов элементов.