Cómo filtrar los elementos de la colección basada en el tipo almacenados en la variable

0

Pregunta

Tengo la siguiente jerarquía:

class Animal

class Dog : Animal

class Cat : Animal

Tengo un List<Animal> colección y quiere hacer un método que devolverá todos los gatos o los perros. Sin embargo, yo no puedo averiguar cómo filtrar la lista de elementos basados en un tipo de variable. Así como esto:

int AnimalsOfType(Type animalType)
{
    // Gives error "animalType is a variable but is used like a type".
    return animals.OfType<animalType>().Count;
}
c# casting inheritance list
2021-11-21 02:30:01
2

Mejor respuesta

0
using System.Linq;

int AnimalsOfType(Type animalType)
{
    return animals.Count(a => a.GetType() == animalType);
}
2021-11-21 05:33:50

Gracias, pero ¿por qué no puede una variable de tipo ot Type se utiliza como un tipo?
K-RUSHer

Usted no puede pasar una variable de Tipo System.Type como un parámetro genérico para una función genérica directamente. La razón es: parámetro Genérico se sustituyen cuando se compila el código Leer esta respuesta que explique más
Ibram Reda

Puede ser simplificado aún más a animals.Count(a => a.GetType() == animalType);
Sarin

@Sarín sí, lo edito
Ibram Reda
0

El método más eficaz en este caso es utilizar MakeGenericMethod y CreateDelegate para crear los delegados a los métodos genéricos. Usted puede caché de estos delegados en un diccionario

static Dictionary<Type, Func<List<Animal>, int>> _methods = new Dictionary<Type, Func<List<Animal>, int>>();

static int CountOfType<T>(List<Animal> source) =>
    source.Count(a => a is T);  
    
int AnimalsOfType(List<Animal> animals, Type animalType)
{
    if(!_methods.TryGetValue(animalType, out var dlgt))
    {
        dlgt = (Func<List<Animal>, int>)
             this.GetType().GetMethod("CountOfType")
                  .MakeGenericMethod(animalType)
                  .CreateDelegate(typeof(Func<List<Animal>, int>)));
        _methods[animalType] = dlgt;
    }
    return dlgt(animals);
}

No hay un único y pequeño costo de inicio la primera vez que se llama a este método, por tipo.

2021-11-21 03:01:30

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................