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

时间:2019-02-15 13:23:53

标签: c# list unity3d compare vuforia

我正在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])

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

2 个答案:

答案 0 :(得分:3)

使用linq:

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

答案 1 :(得分:2)

除了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