如何在C#中的基类型列表中使用Foreach
本文关键字:列表 Foreach 类型 基类 | 更新日期: 2023-09-27 18:16:15
我在每个Tile中都有一个名为"Within"的GameObject类型列表。
List<GameObject> Within = new List<GameObject>();
GameObject派生了类型为Bee
、Flower
和Tree
的类。
我正在做一个foreach
,它应该检测列表中的所有蜜蜂,并选择或取消选择它们。
foreach (Bee bee in Tile.Within)
{
bee.selected = !bee.selected;
}
问题是,当我这样做时,如果列表有一个类型为Flower
或Tree
的对象,我会得到一个异常:
"Unable to cast object of type 'WindowsGame2.Flower' to type 'WindowsGame2.Bee'."
我以为foreach
在调用它时会忽略所有不符合描述的对象,但它没有。。。我怎样才能让它工作?
在foreach中使用LINQ进行过滤怎么样?
foreach (Bee bee in Tile.Within.OfType<Bee>())
{
bee.selected = !bee.selected;
}
这只会选择蜜蜂的,而不会选择花朵或树木。
foreach
可以修改如下:
foreach (GameObject gameObj in Tile.Within)
{
Bee bee = gameObj as Bee;
if(bee != null)
{
bee.selected = !bee.selected;
}
}
您能在项目中使用LINQ吗?
foreach (Bee bee in Tile.Within.Where(o=>o is Bee))
{
bee.selected = !bee.selected;
}
foreach
不能以这种方式工作。它只会将对象"强制转换"为请求的类型。
因此,您需要预先进行筛选(这可能会产生垃圾,如果您在Xbox360上,这可能是一个问题(,或者在循环中进行筛选。
有几种方法可以做到这一点,可以使用as
或is
,也可以同时使用两者。例如:
foreach (GameObject gameObj in Tile.Within)
{
if (gameObj is Bee)
{
Bee bee = (Bee)gameObj;
bee.selected = !bee.selected;
}
}
在每次迭代中,您都应该检查当前项的类型。如果是Bee
,请投射结果并完成您的工作。
foreach (var item in Tile.Within)
{
if (item is Bee)
{
((Bee)item).Selected = !((Bee)item).Selected;
}
}