C# 在具有相同基类的对象列表中循环并提取某个类?

C# 在具有相同基类的对象列表中循环并提取某个类?,c#,class,object,inheritance,C#,Class,Object,Inheritance,例如,我有一个基类Entity,然后有两个子类从中派生,lightetity和PlayerEntity 然后,我有一个列表实体,其中包含亮度s和播放属性s 我希望从实体获得所有的亮度 我试过: List<LightEntity> lights = new List<LightEntity>(); foreach (Entity ent in Entities) { if(ent is LightEntity) { lights.Add(en

例如,我有一个基类
Entity
,然后有两个子类从中派生,
lightetity
PlayerEntity

然后,我有一个
列表实体
,其中包含
亮度
s和
播放属性
s

我希望从
实体
获得所有的
亮度

我试过:

List<LightEntity> lights = new List<LightEntity>();
foreach (Entity ent in Entities)
{
    if(ent is LightEntity)
    {
        lights.Add(ent);
    }
}
List lights=new List();
foreach(实体中的实体)
{
如果(耳鼻喉科是轻的)
{
添加(ent);
}
}
但它不喜欢这样,因为编译器似乎仍然认为它可能会尝试将一个
实体
添加到
亮度
列表中

我试图将
ent
转换为
lightetity
,但编译器说它没有方法将
实体
转换为
lightetity

只将ent转换为(lightetity) 所以

您可以使用按类型筛选实体:

List<LightEntity> lights = new List<LightEntity>();
lights.AddRange(entities.OfType<LightEntity>());
List lights=new List();
lights.AddRange(entities.OfType());
甚至更简单:

List<LightEntity> lights = entities.OfType<LightEntity>().ToList();
List lights=entities.OfType().ToList();
进一步阅读


    • 你可以用linq来做

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

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

      正如已经发布的,铸造是你问题的解决方案

      Lights.Add((LightEntity)ent);
      
      (T)扩展解决方案的列表已经写好了,所以让我展示一下这种老式的方式

      List<LightEntity> lights = new List<LightEntity>();
      foreach (Entity ent in Entities)
      {
          LightEntity le = ent as LightEntity
          if(le != null)
          {
              lights.Add(le);
          }
      }
      
      List lights=new List();
      foreach(实体中的实体)
      {
      发光体=发光体
      如果(le!=null)
      {
      添加(le);
      }
      }
      
      未处理InvalidCastException-无法将PlayerEntity类型的对象强制转换为Lightetty类型
      @MatthewMcGovern-将该行放在if语句中。这很奇怪,因为您正在检查ent是否为Lightetty。PlayerEntity是从Lightetty继承来的吗?@P.Brian.Mackey-Derp。。。我试过那种方法,但我没有先检查类型。凯尔是的,很好用,我太蠢了@MatthewMcGovern不用担心。是的,我开始怀疑他们是否真的需要相同的基类,他们确实共享许多通用代码(基更新函数、基绘图函数、许多成员变量),将它们存储在同一个列表中是因为一个实体可以有许多子实体,我需要一种方法将它们都保存在一个位置,为了存储关系并从Parent->Children更新它们,Linq让这变得非常漂亮:)我以前没有听说过Linq,这很糟糕吗?我只在业余时间在C#上工作。严格地说,这不是Linq,而是IEnumerable Extensions谢谢,这个链接不起作用,但我是通过谷歌搜索你发布的标题找到的。看起来非常有用,我以后肯定会用它。@MatthewMcGovern对此表示抱歉。为了完整起见,我添加了答案的链接。我想告诉你原因。在c#中,不允许隐式向下投射。这意味着您必须进行显式强制转换,这会告诉CLR在我的情况下进行这种向下转换是安全的。
      List<LightEntity> lights = new List<LightEntity>();
      foreach (Entity ent in Entities)
      {
          LightEntity le = ent as LightEntity
          if(le != null)
          {
              lights.Add(le);
          }
      }