Como filtrar itens da coleção de acordo com o tipo armazenado na variável

0

Pergunta

Eu tenho a seguinte hierarquia:

class Animal

class Dog : Animal

class Cat : Animal

Eu tenho um List<Animal> recolha e deseja fazer um método que retornará todos os gatos ou todos os cães. No entanto, eu não consigo descobrir como filtrar a lista de elementos com base em uma variável do tipo. Então, como este:

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

Melhor resposta

0
using System.Linq;

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

Obrigado, mas por que não pode uma variável tipo do at Type ser usado como um tipo?
K-RUSHer

Você não pode passar uma variável do Tipo System.Type como um parâmetro genérico para uma função genérica diretamente. A razão é a seguinte: parâmetro Genérico são substituídos quando o código é compilado Ler esta resposta que explique mais
Ibram Reda

Pode ser ainda mais simplificada para animals.Count(a => a.GetType() == animalType);
Sarin

@Sarin sim, você está certo, eu editar
Ibram Reda
0

O método mais eficiente é usar MakeGenericMethod e CreateDelegate para criar os delegados métodos genéricos. Você pode armazenar estes delegados em um dicionário

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);
}

Não há um único pequeno custo inicial a primeira vez que você chamar este método, por tipo.

2021-11-21 03:01:30

Em outros idiomas

Esta página está em outros idiomas

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