Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В «LINQ к объектам» уже реализована подобная внутренняя оптимизация: многие методы первым делом проверяют реализацию некоторых интерфейсов входной коллекцией, и используют их для более эффективного выполнения действий.
Значительно сокращено количество перегрузок методов за счёт повсеместного использования опциональных параметров (появившихся на год позже LINQ).
(и так в каждом методе) Почему уж тогда неif (source == null) { throw new ArgumentNullException ("source"); } Contract.EndContractBlock ();
Contract.Requires<ArgumentNullException>(source != null)?Про опциональные параметры я в курсе. И проштудировал множество рекомендаций и обсуждений. Авторитетные для меня люди утверждают, что допустимо использовать совершенно очевидное значение (null для ссылочных типов), которое не может измениться ни в какой мыслимой ситуации.
Это единственный вариант не требующий установки и настройки отдельного инструментария и в тоже время позволяющий создавать отдельные конфигурации прокта и использовать в них контракты для статического анализа.
Не вижу ни одного места где мог бы использовать что-то готовое из LINQ.
private class TakeReadOnlyCollection<TSource> : IReadOnlyCollection<TSource> { private readonly IReadOnlyCollection<TSource> _source; private readonly int _сount; public IEnumerator<TSource> GetEnumerator () { var count = _count; foreach (var item in _source) { yield return item; if (--count == 0) { break; } } } }
return _source.AsEnumerable().Take(_count).GetEnumerator()?API фиксирванный (диктуется LINQ), поэтому никто удалять или добавлять параметры не будет.
Я считаю, что не имею права заставлять людей это делать просто чтобы скомпилировать мой проект.
Согласен, в нескольких аналогичных местах можно съэкономить пяток строк кода, считаю это неприпинципиально.
Улучшаем LINQ для работы с IReadOnly-коллекциями