【问题标题】:Compare lists in C# / Unity and ignore items比较 C#/Unity 中的列表并忽略项目
【发布时间】:2019-02-15 13:23:53
【问题描述】:

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

.. 但不知道如何进一步写。任何帮助将不胜感激!

【问题讨论】:

  • 那么你想忽略(不启用)的组件也是rendererComponents Collection的一部分?
  • 是的,因为每次找到目标图像时都会使用此脚本。

标签: c# list unity3d compare vuforia


【解决方案1】:

使用 linq:

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

【讨论】:

  • 我收到一条错误消息,提示“'Renderer[]'不包含'where'的定义,并且找不到接受'Renderer[]'类型的第一个参数的可访问扩展方法'where' "。
  • 有一个错字。其中必须以大写 W 开头
【解决方案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

【讨论】:

  • 非常感谢,第一个示例运行良好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多