我简化了我的问题:
我在该列表中有一个animals
的列表,我存储了dogs
和cats
:
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
是否无法过滤掉一种类型的对象?
答案 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);
}