Когда в коллекции хранятся объекты разных типов, обычный перебор с ручной проверкой
is или as быстро превращается в шаблонный код. OfType<T> решает это в одну строку.Пример:
var mixedList = new List<object> { 1, "hello", 2.5, "world", 3, true };
var stringsOnly = mixedList.OfType<string>();
// Результат: hello, worldИз шести элементов метод выбирает только строки. Числа, булево значение и
double игнорируются.Как это работает под капотом
OfType<T> использует оператор is для каждого элемента. Примерно так выглядит его реализация:public static IEnumerable<T> OfType<T>(this IEnumerable source)
{
foreach (var item in source)
{
if (item is T typed)
yield return typed;
}
}
Метод ленивый: перебор происходит только при итерации по результату, не сразу при вызове.
Когда использовать
Удобно при работе с
IEnumerable<object>, коллекциями ArrayList из старого кода, или когда нужно вытащить конкретный тип из гетерогенной иерархии объектов.var textBoxes = Controls.OfType<TextBox>();
Чем отличается от
Cast<T>Cast<T> бросает InvalidCastException, если встречает несовместимый тип. OfType<T> просто пропускает такой элемент. Если коллекция точно однородная и ошибка должна сигнализировать о проблеме, уместен Cast<T>. В остальных случаях безопаснее OfType<T>.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view