比较 C#/Unity 中的列表并忽略项目

Compare lists in C# / Unity and ignore items

我在 Unity 中使用 Vuforia,它有一个名为 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])

..但不确定如何进一步编写。如有任何帮助,我们将不胜感激!

使用 linq:

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

除了 Leo Bartkus 的回答:

假设您要忽略的项目也是您的 rendererComponents 集合的一部分,您可以执行如下操作:

只需检查循环中的标签。

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

正如 Leo 所建议的,您也可以使用 LINQ

为了使用 LINQ,您必须通过

导入它
using System.LINQ

然后你可以像这样使用它:

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

有关 LINQ 的更多信息,您可能想访问 getting started with LINQ