Как реализовать множественную фильтрацию OfType c LINQ?

В C# существует множество способов использования множественной фильтрации с помощью LINQ. Один из самых распространенных методов - использование метода расширения OfType.

Метод OfType может быть использован для фильтрации элементов коллекции по заданному типу. Он оставляет только те элементы, которые являются экземплярами указанного типа, игнорируя все остальные элементы.

Для реализации множественной фильтрации с помощью OfType можно использовать несколько вызовов этого метода подряд.

Например, предположим, у нас есть коллекция myCollection, содержащая объекты разных типов:

List<object> myCollection = new List<object>
{
    "строка1",
    42,
    new List<int> { 1, 2, 3 },
    "строка2",
    new List<string> { "a", "b", "c" },
    DateTime.Now,
    "строка3"
};

Для того, чтобы отфильтровать только строки и целые числа из myCollection, можно воспользоваться несколькими вызовами OfType:

IEnumerable<string> filteredStrings = myCollection.OfType<string>();
IEnumerable<int> filteredInts = myCollection.OfType<int>();

В результате получим две коллекции filteredStrings и filteredInts, содержащие только строки и целые числа из исходной коллекции myCollection.

Также, в зависимости от вашего конкретного случая, можно использовать комбинацию методов фильтрации LINQ, таких как Where, OfType, Cast. Методы Where и OfType можно использовать для фильтрации по определенному типу, а метод Cast позволяет привести объекты к заданному типу.

Например, предположим, у нас есть коллекция myCollection, содержащая объекты следующих типов:
- string,
- int,
- List<int>,
- object[].

Хотим отфильтровать все элементы, являющиеся списками типа int, и вывести все их элементы:

IEnumerable<int> filteredInts = myCollection
    .OfType<List<int>>()
    .SelectMany(x => x);

В результате создаётся коллекция filteredInts, включающая все элементы списков типа int из исходной коллекции myCollection.