如果数组包含特定类,您如何询问它?

时间:2012-03-10 00:13:52

标签: c# arrays methods xna contains

我正在尝试创建一个“马里奥”视频游戏,为了获得相交的对象,我们的老师为我们提供了一个示例演示,它允许对象检测它是否正在接触另一个对象,并且第一个返回该方法找到的对象。我正在尝试,而是返回当前对象当前正在触摸的每个对象的数组。我能够返回当前触摸它的每个对象的数组,但现在我需要一种简单/有效的方法来检查数组是否包含所需类型的对象,例如

if (array.Contains(Mario))
    {
    //Do Work here
    }

正在检查的数组是否包含(Mario),是相交Sprite的返回数组,但是当我问它是否实际包含Mario类型的对象时,它会显示“Error 14'WindowsGame10.Mario'是一个'type'但用作'变量'“。我知道我可以使用for循环执行此操作,并询问数组if (array[i].GetType() == typeof(Mario))中的每个索引,但是我需要在代码中执行此检查的次数,并重复键入相同的代码再次,我觉得我需要学习一种更有效的方法来执行此操作。我是计算机程序设计的第一年,我正在使用C#XNA,我需要一些我能理解的解决方案。如果有更好的方法,请告诉我。

5 个答案:

答案 0 :(得分:6)

您可以使用LINQ的OfType()Any()方法:

if (array.OfType<Mario>().Any())
{

答案 1 :(得分:4)

使用Linq你可以:

var marios = array.OfType<Mario>();
if (marios.Any())
{
     //Stuff
}

答案 2 :(得分:2)

如果您只是需要知道是否有任何马里奥

if(array.Any(a=>a is Mario))
{
}

这会在找到第一场比赛后立即突破迭代。

答案 3 :(得分:2)

Linq的答案很棒。只是为了提供一种替代方法,您可以定义这样的扩展方法:

static public bool ContainsType(this Array array, Type type)
{
    int len = array.Length; // Note that putting this in the loop is slightly slower
                            // because the compiler can't assume that a property value
                            // remains constant.
    for (int i = 0; i < len; i++)
    {
        if (array.GetValue(i).GetType() == type) return true;
    }

    return false;
}

可以像这样使用:

    Array a = new object[] { "The meaning of life.", 42 };
    bool hasString = a.ContainsType(typeof(string)); // true
    bool hasInteger = a.ContainsType(typeof(int));  // true
    bool hasChar = a.ContainsType(typeof(char));  // false

答案 4 :(得分:1)

最直接的方式(不使用LINQ)将使用is关键字:

foreach (Object obj in array)
{
    if (obj is Mario)
    {
        ...
    }
}

<强>更新 如果你需要一个精确的Type匹配,并希望避免代码重复,我认为一个相当简单的扩展方法是最好的 -

public static bool ContainsType<T>(this T[] arr, Type type)
{
    for (int i = 0; i < arr.Length; i++)
        if (arr[i].GetType().Equals(type))
            return true;
    return false;
}

并使用 -

if (array.ContainsType(typeof(Mario)))