LINQ - Usando o método de consulta LINQ - OfType<T>


O operador OfType<T> permite filtrar os elementos de um IEnumerable com base em um tipo especificado de uma coleção heterogênea.

Este método é implementado usando a execução deferida. O valor de retorno imediato é um objeto que armazena todas as informações necessárias para executar a ação. A consulta representada por esse método não é executada até que o objeto seja enumerado ou pela chamada de seu método GetEnumerator diretamente ou usando foreach.

O método OfType<TResult>(IEnumerable) retorna apenas os elementos na fonte que podem ser convertidos para o tipo TResult. Para receber uma exceção, se um elemento não puder ser convertido para tipo TResult, use Cast<TResult>(IEnumerable).

Este método é um dos poucos métodos de consulta padrão que pode ser aplicado a uma coleção que possui um tipo não parametrizado tal como um ArrayList. Isto porque OfType <TResult> estende o tipo IEnumerable.

O método OfType<TResult> não só pode ser aplicado a coleções com base no tipo parametrizado IEnumerable<T> mas também a coleções que são baseadas em tipos IEnumerable não-parametrizados.

Ao aplicar o método OfType<TResult> a uma coleção que implementa IEnumerable, você ganha a habilidade de consultar a coleção usando os operadores de consulta padrão. Por exemplo, ao especificar um argumento do tipo object para OfType<TResult> teremos como retorno um objeto do tipo IEnumerable<object>, para o qual os operadores de consulta padrão que podem ser aplicados.

1- Filtrando coleções por tipo especificado

No código a seguir vamos filtrar uma coleção especificando o tipo desejado. No caso iremos filtrar o tipo string:

Namespaces usados :

using System;
using System.Linq;

namespace LINQ_Filtro_OfType
{
    class Program
    {
        static void Main(string[] args)
        {
            object[] numeros = { "Macoratti", 28, 12 / 12 / 2006, 3.3f, 1, "Miriam", 8.0, "Janice", true, "Jefferson" };

            var So_Strings = numeros.OfType<string>();

            Console.WriteLine("Relação de amigos...");
            Console.WriteLine("-----------------------------");
            foreach (var s in So_Strings)
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
    }
}

2- Aplicando operadores de consulta padrão após usar OfType<T> em um ArrayList:

Namespaces usados :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;

namespace LINQ_OfType
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList frutas = new System.Collections.ArrayList(5);
            frutas.Add("Manga");
            frutas.Add("Laranja");
            frutas.Add("Banana");
            frutas.Add(99.0);
            frutas.Add("Melancia");
            frutas.Add("Melão");

            // Aplicando o método OfType() ao ArrayList e filtrando o tipo string
            IEnumerable<string> consulta1 = frutas.OfType<string>();

            Console.WriteLine("Os elementos do tipo string são :");
            foreach (string fruta in consulta1)
            {
                Console.WriteLine(fruta);
            }

            // A consulta a seguir mostra que os operadores de consulta padrão tal como 
            // Where() podem ser aplicados a um tipo ArrayList depois de chamar o método OfType().
            IEnumerable<string> consulta2 = frutas.OfType<string>().Where(fruta => fruta.ToLower().Contains("n"));

            Console.WriteLine("\nAs segintes strings contém o caractere 'n':");
            foreach (string fruta in consulta2)
            {
                Console.WriteLine(fruta);
            }
        }
    }
}

Heb 2:1 Por isso convém atentarmos mais diligentemente para as coisas que ouvimos, para que em tempo algum nos desviemos delas.

Heb 2:2 Pois se a palavra falada pelos anjos permaneceu firme, e toda transgressão e desobediência recebeu justa retribuição,

Referências:


José Carlos Macoratti