我正在尝试创建一个“马里奥”视频游戏,为了获得相交的对象,我们的老师为我们提供了一个示例演示,它允许对象检测它是否正在接触另一个对象,并且第一个返回该方法找到的对象。我正在尝试,而是返回当前对象当前正在触摸的每个对象的数组。我能够返回当前触摸它的每个对象的数组,但现在我需要一种简单/有效的方法来检查数组是否包含所需类型的对象,例如
if (array.Contains(Mario))
{
//Do Work here
}
正在检查的数组是否包含(Mario),是相交Sprite的返回数组,但是当我问它是否实际包含Mario类型的对象时,它会显示“Error 14'WindowsGame10.Mario'是一个'type'但用作'变量'“。我知道我可以使用for循环执行此操作,并询问数组if (array[i].GetType() == typeof(Mario))
中的每个索引,但是我需要在代码中执行此检查的次数,并重复键入相同的代码再次,我觉得我需要学习一种更有效的方法来执行此操作。我是计算机程序设计的第一年,我正在使用C#XNA,我需要一些我能理解的解决方案。如果有更好的方法,请告诉我。
答案 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)))