6

例如,我有一个基类Entity,然后是从它派生的两个子类,LightEntity以及PlayerEntity.

然后我有一个List<Entity> Entities持有LightEntitys和PlayerEntitys的。

我希望LightEntityEntities.

我试过了:

List<LightEntity> lights = new List<LightEntity>();
foreach (Entity ent in Entities)
{
    if(ent is LightEntity)
    {
        lights.Add(ent);
    }
}

但它不喜欢这样,因为编译器似乎仍然认为它可能会尝试将一个添加EntityLightEntity.

我试图转换ent为,LightEntity但编译器说它没有将 a 转换Entity为 a 的方法LightEntity

4

5 回答 5

14

您可以使用OfType按类型过滤实体:

List<LightEntity> lights = new List<LightEntity>();
lights.AddRange(entities.OfType<LightEntity>());

或者更简单:

List<LightEntity> lights = entities.OfType<LightEntity>().ToList();

延伸阅读

于 2013-05-09T21:27:31.073 回答
5

只需将 ent 转换为 (LightEntity) 所以

Lights.Add((LightEntity)ent);
于 2013-05-09T21:26:24.113 回答
2

那么 List(Of T) 扩展解决方案已经写好了,所以让我展示一下这种老式的方式

List<LightEntity> lights = new List<LightEntity>();
foreach (Entity ent in Entities)
{
    LightEntity le = ent as LightEntity
    if(le != null)
    {
        lights.Add(le);
    }
}
于 2013-05-09T21:29:39.363 回答
1

你可以用linq做到这一点......

 var lights = Entities.Where(e => e is LightEntity)
                      .Select(e => (LightEntity)e)
                      .ToList();
于 2013-05-09T21:28:28.000 回答
0

嗯,首先。我不知道您为什么要这样做,但我很确定这不是解决您的问题的最佳方法。可能您的派生类不应具有相同的基类或类似的东西。如果你需要帮助,你应该给我们更大的图景。

正如已经发布的那样,铸造是解决您问题的方法。

Lights.Add((LightEntity)ent);
于 2013-05-09T21:29:31.843 回答