首页 > 解决方案 > 如何从列表中计算具有指定子类的成员?

问题描述

我有一Enemy堂课。

有从它继承的类,如SoldierCaptain等。

我有一个包含所有敌人的列表。

如果我想计算有多少是 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;
}

标签: c#

解决方案


这将起作用:

public int CountEnemiesByType<T>()  where T : Enemy
{
    return enemies.OfType<T>().Count();
}

像这样称呼它:

int soldierCount = CountEnemiesByType<Soldier>();

在这里看到它的工作:

https://dotnetfiddle.net/eEeElR

我也倾向于像这样构建它:

public int CountEnemiesByType<T>(IEnumerable<Enemy> enemies)  where T : Enemy
{
    return enemies.OfType<T>().Count();
}

但更重要的是,这似乎是我们应该使用组合而不是继承的地方:敌人有一个类型,而不是一个类型。


推荐阅读