简化变换上的foreach

时间:2017-03-01 13:59:00

标签: c# linq unity3d foreach transform

是否可以使用Linq简化以下代码?

Transform parent;
List<GameObject> children = new List<GameObject>();
foreach (Transform child in parent)
{
    children.Add(child.gameObject);
}

我希望简单地写一下parent.ForEach()但转换并不是很方便。有没有人知道这个的简化?

这只是好奇而没有必要。

编辑:父母不是孩子的列表,而是变换。

Attempt at Balázs' answer

2 个答案:

答案 0 :(得分:4)

你的情况不会像你期望的那样使用Linq。您可以做的一件事是使用扩展方法,如下所示。

public static class Extension{
    public static IEnumerable<Transform> GetChildren(this Transform tr)
    {
        List<Transform> children = new List<Transform>();
        foreach (Transform child in tr)
        {
            children.Add(child);
        }
        // You can make the return type an array or a list or else.
        return children as IEnumerable<Transform>;
    }
}

并将其用作:

IEnumerable<Transform> trs = parent.GetChildren();

编辑: 魔法发生在参数中的this关键字上。该方法由实例调用,但实际上是静态的。调用实例将添加到参数列表中。在不太深入的情况下,它会在实例上提供静态方法。如果不放在特定的命名空间中,则不需要在自己的代码上添加任何内容。

答案 1 :(得分:4)

如果Transform实现了IEnumerable,而不是IEnumerable<Transform>,那么您首先需要将其转换为通用版本才能使用Linq:

List<GameObject> children = parent
                               .Cast<Transform>()
                               .Select(t => t.gameObject)
                               .ToList();