基于类型

时间:2017-03-21 11:55:01

标签: c#

我简化了我的问题:

我在该列表中有一个animals的列表,我存储了dogscats

private List<Animal> animals;

private Constr()
{
    animals = new List<Animal>();
}

public void addCat(Cat cat)
{
    animals.Add(cat);
}

public void addDog(Dog dog)
{
    animals.Add(dog);
}

现在我想过滤掉只有猫。我已经尝试过了:

public List<Cat> getCats()
{
    return animals.OfType<Animal>().ToList();
}

和此:

public List<Cat> getCats()
{
    return animals.Where((type) => type.GetType() ==  typeof(Animal));
}

但两者都不起作用。

  

无法将类型Project.Animal转换为Project.Cat

是否无法过滤掉一种类型的对象?

1 个答案:

答案 0 :(得分:6)

如果您想要Cat类型的项目,那么您应该指明:

public List<Cat> getCats()
{
    return animals.OfType<Cat>().ToList();
}

更多的手动方法:

public List<Cat> getCats()
{
    return animals.Where(animal => animal is Cat)
                  .Select(animal => (Cat)animal);
}

请注意is的使用,而不是.GetType() == ...。如果您使用的是.GetType() == ...,那通常会产生代码味道。

这是一个更有效的手动版本版本,按相反的顺序完成:

public List<Cat> getCats()
{
    return animals.Select(animal => animal as Cat)
                  .Where(cat => cat != null);
}