Сравнивайте списки в C#/Unity и игнорируйте элементы

Я использую Vuforia в Unity со встроенным скриптом DefaultTrackableEventHandler. У него есть такой код;

protected virtual void OnTrackingFound()

{
    var rendererComponents = GetComponentsInChildren<Renderer>(true);

            foreach (var component in rendererComponents)
            component.enabled = true;
}

У меня есть некоторые элементы с тегом «ignoreRend», которые я не хочу отображать, когда отслеживание находит целевое изображение. У меня есть такой список:

GameObject[] ignoreTheseObjects = GameObject.FindGameObjectsWithTag("ignoreRend");

Я безуспешно пытался найти способ заставить цикл foreach игнорировать элементы в моем списке ignoreTheseObjects. Кажется, что-то, что было бы легко закодировать, но я застрял... Есть ли способ сравнить элементы в списках? Я пробовал искать ответы, но не нашел ничего подходящего для этой проблемы. Я думаю что-то вроде;

            if (rendererComponents[i] == ignoreTheseObjects[i])

.. но не уверен, как написать это дальше. Любая помощь будет оценена по достоинству!

Итак, компоненты, которые вы хотите игнорировать (не включать), также являются частью коллекции rendererComponents?

Tobias Theel 15.02.2019 14:29

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

Inori 15.02.2019 15:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
196
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование линка:

foreach (var component in rendererComponents.Where(r => r.gameObject.tag != "ignoreRend"))

Я получаю сообщение об ошибке: "'Renderer[]' не содержит определения для 'where', и не найден доступный метод расширения 'where', принимающий первый аргумент типа 'Renderer[]'".

Inori 15.02.2019 15:09

Есть опечатка. Где должно начинаться с заглавной буквы W

Tobias Theel 15.02.2019 15:12
Ответ принят как подходящий

В дополнение к ответу Лео Барткуса:

Предполагая, что элементы, которые вы хотите игнорировать, также являются частью вашей коллекции rendererComponents, вы можете просто сделать что-то вроде следующего:

Просто проверьте тег в цикле.

foreach (var component in rendererComponents)
{
        if (component.tag == "ignoreRend")
        {
           continue; //this will continue with next item in list
        }
        component.enabled = true;
}

Как предложил Лео, вы также можете использовать LINQ

Чтобы использовать LINQ, вы должны импортировать его с помощью

using System.LINQ

Затем вы можете использовать его как:

var filteredComponents = rendererComponents.Where(r => r.gameObject.tag != "ignoreRend")
foreach (var component in filteredComponents)
{
     component.enabled = true;
}

Для получения дополнительной информации о LINQ вы можете посетить начало работы с LINQ

Большое спасибо, первый пример сработал отлично!

Inori 15.02.2019 15:15

Другие вопросы по теме