在链接列表中查找类

时间:2013-01-12 17:10:08

标签: c# linked-list

我正在制作这个2-D游戏,我希望能够构建结构。玩家必须能够从某些结构中受益。今天游戏看起来像这样:

enter image description here (蓝点是玩家,其他点是ais)

我创建了一个名为Structure的类和其他三个继承自Structure的类。这些类或多或少是空的。游戏的牌块有自己的名为Tile的类。在这堂课中,我写了一些东西,但感兴趣的代码就是:

public LinkedList<Structure> Structures = new LinkedList<Structure>();

当我构建一个结构(例如壁炉)时,代码如下所示:

Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.
    AddFirst(new Fireplace());

我不确定的部分是我如何检查列表是否包含壁炉(例如名为Fireplace的类)或任何其他建筑物。例如,如果玩家在瓷砖上找到壁炉,他/她将恢复温暖。这不起作用。也许我对所有这些都采取了错误的方法,在任何一种情况下,请提供代码示例。

答案结论:

bool anyFireplace = Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.OfType<Fireplace>().Any();
if (anyFireplace)
{
    Warmth = MaxWarmth;
}
else
{
if (Warmth > 0)
{
    Warmth--;
}
else
{
    HP--;
}
}

5 个答案:

答案 0 :(得分:2)

我建议使用is关键字。它用于检查变量是否具有某种类型。例如:

object example = "Hello World!";
bool isString = example is string; // Evaluates to true

您可以在代码中使用它:

foreach (Structure s in Structures)
{
    if (s is FirePlace)
    {
        // Warmup the player
    }
}

此外,我建议使用List<T>代替LinkedList<T>,因为List<T>(通常)much faster

正如你可能从其他一些答案中得到的那样,多种方式可以通过多种方式引领罗马。但是,根据this测试,is这样做的方式优于所有其他建议方式(感谢Hogan btw进行此测试):

  

OfType时间:.6702958,   GetType时间:.2268946,   物业时间:.1400208,   是时候了:.1112995

这样is更清洁恕我直言。

答案 1 :(得分:2)

您可以使用Enumerable.OfType<TResult>()Enumerable.Any(TSource),如下所示:

LinkedList<Structure> structures = new LinkedList<Structure>();

// Add Different Types of Structures

Boolean anyFireplace = structures.OfType<Fireplace>().Any();

请确保您拥有:

using System.Linq;

在源代码顶部的using指令中,以及对System.Core程序集模块的引用。如果你需要知道LinkedList中的壁炉的确切数量,你也可以使用Count()方法,否则Any()在Linq对象中更有效。

答案 2 :(得分:1)

您可以使用LINQ to Objects:

LinkedList<Structure> list = ...

List<Fireplace> fireplaces = list.OfType<Fireplace>().ToList();

fireplaces是类型Fireplace列表中所有元素的列表 - 如果不存在则为空列表。

如果您只是想知道一个是否存在,您可以将其调整为:

bool hasFirplace = list.OfType<Fireplace>().Any();

答案 3 :(得分:0)

也许不建议使用类名描述对象。你将不得不使用有点慢的反射。你只得到一个描述(类名)。你需要的不仅仅是一个。您可能需要考虑这样的基础对象:

public abstract class MapObject
{
   public int x,y;  // object location
   public string myclass;  // object class
   public string mytype;   // object type
   // etc

   // constructor
   public MapObject(string myclass, string mytype);

}

然后壁炉可能看起来像这样

public class FirePlace : MapObject
{
   public FirePlace() 
       : base("Builtin furniture", "Fireplace") { }
   // etc
}

现在你可以遍历mytype =“Fireplace”的所有MapObjects

答案 4 :(得分:-1)

您可以使用类型来了解:

foreach(var s in Structures)
{
  var type = s.GetType();
  if(type == typeof(FirePlace)
  {
    (your code here)
  }
}

对于单一方法

public bool HasType<T>(IEnumerable<T> list, Type t)
{
    return list.Any(e=>e.GetType() == t);
}

用法应该是:

if(HasType(Structures,typeof(FirePlace))
{
  (code here)
}

最后你可以把它变成一个扩展方法,但我把那个选项留给你;)