如何在C#中的基类型列表中使用Foreach

本文关键字:列表 Foreach 类型 基类 | 更新日期: 2023-09-27 18:16:15

我在每个Tile中都有一个名为"Within"的GameObject类型列表。

List<GameObject> Within = new List<GameObject>();

GameObject派生了类型为BeeFlowerTree的类。

我正在做一个foreach,它应该检测列表中的所有蜜蜂,并选择或取消选择它们。

foreach (Bee bee in Tile.Within)
{
    bee.selected = !bee.selected;
}

问题是,当我这样做时,如果列表有一个类型为FlowerTree的对象,我会得到一个异常:

"Unable to cast object of type 'WindowsGame2.Flower' to type 'WindowsGame2.Bee'."

我以为foreach在调用它时会忽略所有不符合描述的对象,但它没有。。。我怎样才能让它工作?

如何在C#中的基类型列表中使用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上,这可能是一个问题(,或者在循环中进行筛选。

有几种方法可以做到这一点,可以使用asis,也可以同时使用两者。例如:

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