加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:41:22 所属栏目:百科 来源:网络整理
导读:我正在学习编程,我不得不创建一个蛇游戏. 在游戏中,蛇有大约5种可能的消耗品,我决定将每种新消耗品都放在消耗品阵列中. 现在我想通过数组迭代foreach循环并执行以下操作: foreach (Apple apple in consumables){ renderer.DrawApple(apple);} 但是当数组中
我正在学习编程,我不得不创建一个蛇游戏.

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

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

foreach (Apple apple in consumables)
{
    renderer.DrawApple(apple);
}

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

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

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

解决方法

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

foreach (Apple apple in consumables.OfType<Apple>())
{
    renderer.DrawApple(apple);
}

使用as operator的非linq解决方案几乎完全相同:

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

然而IMO如果所有这些项目都放在同一个列表中,并且它们都已经从Consumble继承,那么使用多态性的更好的设计是为@dasblinkenlight建议的每种类型的消耗品定义一个绘制方法.并针对每种类型进行特定实施.在SegmentRemover的情况下,它可能是一个空实现,在Apple中它可能会调用渲染器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读