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);
}
}