c# - 如何从列表中计算具有指定子类的成员?
问题描述
我有一Enemy
堂课。
有从它继承的类,如Soldier
、Captain
等。
我有一个包含所有敌人的列表。
如果我想计算有多少是 type Soldier
,我可以这样做:
List<Enemy> enemies;
public int CountSoldiers()
{
int count = 0;
foreach (Enemy enemy in enemies)
{
if (enemy is Soldier)
{
count++;
}
}
return count;
}
但是敌人有很多种,我想按任何一种来计算。有没有办法将敌人或其类型作为参数传递给它以便计算?
那将是一个示例代码,但它不起作用:
public int CountEnemyType(System.Type type)
{
int count = 0;
foreach (Enemy enemy in enemies)
{
if (enemy is type)
{
count++;
}
}
return count;
}
解决方案
这将起作用:
public int CountEnemiesByType<T>() where T : Enemy
{
return enemies.OfType<T>().Count();
}
像这样称呼它:
int soldierCount = CountEnemiesByType<Soldier>();
在这里看到它的工作:
我也倾向于像这样构建它:
public int CountEnemiesByType<T>(IEnumerable<Enemy> enemies) where T : Enemy
{
return enemies.OfType<T>().Count();
}
但更重要的是,这似乎是我们应该使用组合而不是继承的地方:敌人有一个类型,而不是一个类型。
推荐阅读
- pdf - PDFBox 文本提取、旋转和字体名称、大小
- nsis - NSIS:LangString X 多次设置为0,浪费空间
- c++ - 模板类的复制构造函数并不总是适用于较新的 gcc
- aws-sdk-js - AWS js sdk - 是强制性的凭证
- linux - 查找不在 .git 目录中的大文件
- c++ - 如何定义依赖于参数包转换的函数的返回类型?
- spring - @Autowired 在 springboot 应用程序中不起作用
- postgresql - 如何小写postgresql数组?
- c# - ASP .NET CORE 2.0 - 无法在 Debian 上启动服务
- android - 远程获取领域数据库 Android