检查特定列表索引的子类

时间:2011-03-25 11:54:25

标签: c# list xna subclass

您好我想知道如何检查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”。

4 个答案:

答案 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));