【问题标题】:C# Cast list using Linq using Where functionC# Cast 列表使用 Linq 使用 Where 函数
【发布时间】:2015-04-10 04:52:38
【问题描述】:

我目前正在尝试优化获取 Unity 中包含特定组件的对象的函数的一部分。

当前代码如下所示

Collider[] collisions = Physics.OverlapSphere(point, range);
foreach (Collider item in collisions)
{
      if (item.GetComponent<Rigidbody2D>())
      {
           rigidbodies.Add(item.GetComponent<Rigidbody2D>());
      }
}

首先我得到一个包含碰撞器的对象列表,然后我运行一个 foreach 循环来获取还包含 Rigidbody2D 组件的对象

我正在尝试使用 LINQ 将其转换为一行代码。我正在尝试沿着这条线做一些事情

Collider[] collisions = Physics.OverlapSphere(point, range);
rigidbodies = (List<Rigidbody2D>)collisions.ToList().OfType<Rigidbody2D>().Where(x => x.GetComponent<Rigidbody2D>() == true);

不幸的是,这只会引发 InvalidCastException

【问题讨论】:

  • 而且错误当然是正确的,您拥有的对象不是列表,而您试图假装它实际上是一个列表。您需要实际创建一个列表,而不是告诉编译器非列表对象实际上是一个列表。
  • 我不认为您在这里进行了正确的优化,不能保证 linq 会更快,但是将 item.GetComponent&lt;&gt;() 设置为变量将减少两次检索值的需要

标签: c# linq optimization unity3d


【解决方案1】:

您只需在方法链上添加对ToList() 的调用。

您还可以完全摆脱演员阵容:

rigidBodies = 
    collisions
        .OfType<RigidBody2D>()
        .Where(x => x.GetComponent<RigidBody2D>())
        .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多