您好我想知道如何检查List中特定位置的对象是否等于某事。
我有3个“Ship”子类,它们被称为“Enemy”,“Enemy2”,“Player” 所有这些都保存在我称之为“Ships”的列表中
我想知道如何在列表中检查索引处的项目是上述之一。这很难解释,我会尝试用代码解释。
for (int i = 0; i < Game1.Ships.Count; i++)
{
if(Game1.Ships.ElementAt(i) == "Enemy")
Enemy e = Game1.Ships.ElementAt(i);
if (this.collisionBox.Intersects(e.collisionBox))
{
e.Destroy(false);
//Execute Destory(bool).
}
}
else
i++;
//Skip to next item.
这大致是我要做的事情,显然我需要检查一下它不是玩家。我也必须为Enemy2做同样的循环。 虽然默认情况下“Ship”没有Destroy(bool),但它只存在于“Enemy”&amp; “Enemy2”。
答案 0 :(得分:3)
只需使用is
:
for (int i = 0; i < Game1.Ships.Count; i++)
{
if(Game1.Ships.ElementAt(i) is Enemy)
{
Enemy e = (Enemy)Game1.Ships.ElementAt(i);
if (this.collisionBox.Intersects(e.collisionBox))
{
e.Destroy(false);
//Execute Destory(bool).
}
}
else
i++;
//Skip to next item.
}
答案 1 :(得分:0)
并考虑
foreach (var e in Game.Ships.OfType<IDestroy>())
e.Destroy()
这看起来似乎是一个很好的策略
“发货”没有 默认情况下有一个Destroy(bool),它是 只存在于“敌人”和“敌人”中“Enemy2”
我不能/不会添加界面以便于选择船型,然后您可以诉诸
var destroyables = Game.Ships
.OfType<Enemy>()
.Concat(
Game.Ships.OfType<Enemy2>());
我是否需要指出哪种方法可以投票?
答案 2 :(得分:0)
你绝对不想像这样使用ElementAt()
,因为它每次都会迭代序列的开头。我建议使用foreach
循环和OfType<>()
代替:
foreach (var e in Game1.Ships.OfType<Enemy>())
{
if (this.collisionBox.Intersects(e.collisionBox))
e.Destroy(false);
}
或者,如果Game1.Ships
实施ICollection
,您可以使用for
循环并将.ElementAt(i)
替换为[i]
:
for (int i = 0; i < Game1.Ships.Count; i++)
{
var e = Game1.Ships[i] as Enemy;
if (e != null)
if (this.collisionBox.Intersects(e.collisionBox))
e.Destroy(false);
}
答案 3 :(得分:0)
或LINQish:
var enemiesToDestroy = from enemy in Game1.Ships.OfType<Enemy>()
where this.collisionBox.Intersects(enemy.collisionBox)
select enemy;
enemiesToDestroy.ToList().ForEach(enemy => enemy.Destroy(false));
如果要摆脱ToList()转换,请定义以下扩展方法
public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
{
foreach (TSource element in source)
action (element);
}
并像这样使用它:
enemiesToDestroy.ForEach(enemy => enemy.Destroy(false));