Как вы спрашиваете массив, если он содержит определенный класс? - PullRequest
2 голосов
/ 10 марта 2012

Я пытаюсь создать видеоигру «Марио», и для того, чтобы получить пересекающиеся объекты, наш учитель предоставил нам пример демонстрации, который позволяет объекту определить, касается ли он ТОЛЬКО другого объекта, и первыйобъект, который находит метод, возвращается.Вместо этого я пытаюсь вернуть массив каждого объекта, к которому в данный момент относится текущий объект.Я был в состоянии вернуть массив каждого объекта, который в данный момент касается его, но теперь мне нужен простой / эффективный способ проверить, содержит ли массив объект требуемого типа, такой как

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

Массив, которыйпроверяется, содержит ли он (Mario) возвращаемый массив пересекающихся спрайтов, но когда я спрашиваю, действительно ли он содержит объекты типа Mario, он говорит: «Ошибка 14« WindowsGame10.Mario »является« типом », но используетсякак «переменная» ».Я знаю, что мог бы сделать это с помощью цикла for и запрашивать каждый отдельный индекс в массиве if (array[i].GetType() == typeof(Mario)), но сколько раз мне понадобилось бы выполнить эту проверку в коде и повторно вводить один и тот же код снова и снова,Я чувствую, что мне нужно изучить более эффективный способ выполнить это.Я на первом курсе компьютерного программирования и работаю с C # XNA, и мне нужно какое-то решение, которое я могу понять.Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Ответы [ 5 ]

6 голосов
/ 10 марта 2012

Вы можете использовать методы LINQ OfType() и Any():

if (array.OfType<Mario>().Any())
{
4 голосов
/ 10 марта 2012

Используя Linq, вы можете:

var marios = array.OfType<Mario>();
if (marios.Any())
{
     //Stuff
}
2 голосов
/ 10 марта 2012

Ответы 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
2 голосов
/ 10 марта 2012

если вам просто нужно знать, есть ли Марио, тогда

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

это выйдет из итерации, как только будет найдено первое совпадение.

1 голос
/ 10 марта 2012

Самый простой способ (без использования 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)))
...