Как известно, при использовании интерфейса
IEnumerable<> там, где подразумевается коллекция, могут случаться проблемы (см. например
Проблемы использования IEnumerable и
LINQ против LSP). К счастью, в .NET v4.5 в 2012-м году (немного поздновато, но лучше поздно, чем никогда), появились интерфейсы
IReadOnlyCollection<>,
IReadOnlyList<>,
IReadOnlyDictionary<> (далее буду их обобщённо называть
IReadOnly-интерфейсы). В отличие от
IEnumerable<>,
IReadOnly-интерфейсы дают возможность достаточно и без лишних требований обозначать функциональность коллекции, что и позволяет их рекомендовать для использования вместо
IEnumerable<> везде, где подразумевается чтение коллекции. Но тут встречается одно затруднение. Одним из важных компонентов, потребляющим и создающим коллекции, является
LINQ и, особенно, его часть «LINQ к объектам». К сожалению,
IReadOnly-интерфейсы появились через 5 лет после LINQ, и в нём не используются. Все входные и выходные коллекции LINQ-операций имеют базовый тип
IEnumerable<>, исходя из ограниченных возможностей которого, многие операции подразумевают лишние затраты: полный последовательный перебор или даже создание промежуточных копий входных коллекций. Более того, возвращая из операций тот же
IEnumerable<>, LINQ требует при дальнейшем использовании результата опять использовать полный перебор и создание промежуточных копий. В связи с этим, у меня давно зрела мысль «подружить» LINQ с
IReadOnly-интерфейсами.