通过具有相同基类的对象列表循环并提取某个类?

时间:2013-05-09 21:25:03

标签: c# class object inheritance

例如,我有一个基类Entity,然后是两个子类,派生自LightEntityPlayerEntity

然后我有一个List<Entity> Entities,其中包含LightEntityPlayerEntity s。

我希望从LightEntity获取所有Entities

我试过了:

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

但它并不喜欢这样,因为编译器似乎仍然认为它可能只会尝试将Entity添加到LightEntity列表中。

我尝试将ent转换为LightEntity,但编译器表示它没有将Entity转换为LightEntity的方法。

5 个答案:

答案 0 :(得分:13)

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

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

甚至更容易:

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

进一步阅读

答案 1 :(得分:5)

刚刚施放(LightEntity) 所以

Lights.Add((LightEntity)ent);

答案 2 :(得分: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);
    }
}

答案 3 :(得分:1)

你可以用linq ...

来做
 var lights = Entities.Where(e => e is LightEntity)
                      .Select(e => (LightEntity)e)
                      .ToList();

答案 4 :(得分:0)

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

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

Lights.Add((LightEntity)ent);