首页 > 解决方案 > 如何在没有空值的情况下在 Linq 中实现查询?

问题描述

我正在努力了解我是否对这个 Linq 查询做得正确。不幸的是,我是新手,使用 lambda 表达式仍然有很多问题。

m_ItemList包含不同的列表GameObject

这些对象具有不同的脚本行为,我只想隔离这些拥有脚本的人Cars并检索哪些拥有boolvar on true。这是我首先创建的查询。

itemBought = m_ItemList.Where(x => x.GetComponent<Cars>().Bought).ToList();

显然,这给了我一个异常的问题,因为不是每个人都Cars附加了脚本组件。

因此我找到了解决方案:

itemBought = m_ItemList.Where(x => x.GetComponent<Cars>()).Where(x => x.GetComponent<Cars>().Bought).ToList();

这很好用,但很难看到,我什至不确定这是实现它的最佳方式(也许性能也很差)。

有什么帮助吗?

标签: c#linqunity3d

解决方案


GetComponent是相对昂贵的操作,所以我会尝试每个对象只调用一次。因此,选择 的结果GetComponent,过滤掉具有错误值的空值和非空Bought值:

itemBought = m_ItemList.Select(x => x.GetComponent<Cars>())
        .Where(c => c != null && c.Bought == true)
        .ToList();

如果您可以使用itemBought类型List<Cars>List<MonoBehaviour>其他类似的东西,这将有效,并且避免需要GetComponent<Cars>在后面的行中使用


推荐阅读