C# - Foreach循环仅迭代某些对象

Pat*_*tai 3 c# arrays foreach object

我正在学习编程,我不得不创建一个蛇游戏.

在游戏中,蛇有大约5种可能的消耗品,我决定把每个新的都Consumable放在一个Consumable阵列中.

现在我想foreach通过数组循环迭代并执行以下操作:

foreach (Apple apple in consumables)
{
    renderer.DrawApple(apple);
}
Run Code Online (Sandbox Code Playgroud)

但是当数组中有不同的对象时,如a Apple和a SegmentRemover(这是可能的,因为它们从Consumable类中继承),那么编译器SegmentRemover也会迭代,我得到一个无效的强制转换异常.

我想,因为我在foreach循环中声明我只想迭代Apple对象,它应该工作.

有没有简单的方法来解决这个问题?最好不要使用var或者typeof,因为我还不允许使用这些.

Gil*_*een 5

你真正想要的只是那些"可浇铸"到那种类型的物品Apple.为此用途OfType<Apple>(使用linq):

foreach (Apple apple in consumables.OfType<Apple>())
{
    renderer.DrawApple(apple);
}
Run Code Online (Sandbox Code Playgroud)

一个非linq解决方案将使用as运算符:

foreach(var item in consumbles)
{
    var apple = item as Apple;
    if(apple != null) 
    {
        renderer.DrawApple(apple);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而IMO如果所有这些项目都放在同一个列表,因为它们都继承Consumble已,更好的设计都在一起,使用polymorphisem,是定义为每种类型的Consumable一个draw作为@dasblinkenlight建议的方法.并针对每种类型进行特定实施.在SegmentRemover它可能是一个空的实现的情况下,它可能Apple会调用renderer.