unity linq 返回匹配对象

Mug*_*tsu 1 c# linq unity-game-engine

我正在统一使用 System.Linq,我想知道这是否可以实现:

我想搜索一个 RaycastHits 列表,如果它包含一个带有特定组件的命中,我想返回它而不是 RaycasHit

hits.FirstOrDefault(hit => hit.transform.GetComponent<Target>());
Run Code Online (Sandbox Code Playgroud)

这会返回一个 RaycastHit,其中包含组件 Target。我想立即获取该 Target 组件,这样我就不必在新行中再次获取组件

RaycastHit target = hits.FirstOrDefault(hit => hit.transform.GetComponent<Target>());

Target combatTarget = target.transform.GetComponent<Target>();
Run Code Online (Sandbox Code Playgroud)

是否可以在一行中投射或映射它?

Ruz*_*ihm 5

首先映射它,然后获取第一个或默认值:

Target = hits
        .Select(hit => hit.transform.GetComponent<Target>())
        .FirstOrDefault(item => item != null);
Run Code Online (Sandbox Code Playgroud)

  • 然而,为了提高效率:这实际上是一个很好的例子,为什么不要太频繁地使用 Linq ^^ 在这里,无论如何,您都必须使用“GetComponent”对所有“hits”进行一次解析。最好使用例如 `foreach(var hit in attempts){ var target = hit.transform.GetComponent&lt;Target&gt;(); if(目标) { 返回目标; } } return null;` 它不是“单行代码”(一切都可以在 C# 中,正如您在此处看到的那样 ^^),但它是您将获得的最高效的方法;) (2认同)
  • @LeoBartkus 在 Linq 中,顺序仍然很重要..可能不是为了执行顺序,而是为了您正在运行哪个查询!`hits.FirstOrDefault(hit =&gt; hit != null).Select(hit =&gt; hit.transform.GetComponent&lt;Target&gt;());` 的作用是:从 `hits` 中获取第一个不为 `null` 的元素。在第一个“RayCastHit”上,现在运行“hit.transform.GetComponent&lt;Target&gt;()”,这可能会成功或失败。这完全不是你想要的。您需要 `hits.Select(hit =&gt; hit.transform.GetComponent&lt;Target&gt;()).FirstOrDefault();` 返回例如 `null, target1, null, null, target2`,然后获取第一个有效的 (2认同)