C# 基于变换的简化foreach

C# 基于变换的简化foreach,c#,linq,unity3d,foreach,transform,C#,Linq,Unity3d,Foreach,Transform,是否可以使用Linq简化以下代码 Transform parent; List<GameObject> children = new List<GameObject>(); foreach (Transform child in parent) { children.Add(child.gameObject); } transformparent; 列表子项=新列表(); foreach(在父对象中转换子对象) { 添加(child.gameObject); }

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

Transform parent;
List<GameObject> children = new List<GameObject>();
foreach (Transform child in parent)
{
    children.Add(child.gameObject);
}
transformparent;
列表子项=新列表();
foreach(在父对象中转换子对象)
{
添加(child.gameObject);
}
我希望只编写parent.ForEach(),但转换并没有这么方便。有人知道这种简化吗

这只是好奇,没有必要

编辑:父项不是子项列表,而是转换


使用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 GetChildren(此转换tr)
{
列表子项=新列表();
foreach(在tr中转换子对象)
{
添加(child);
}
//您可以将返回类型设置为数组、列表或其他形式。
将儿童作为可数对象返回;
}
}
您将其用作:

IEnumerable<Transform> trs = parent.GetChildren();
IEnumerable trs=parent.GetChildren();
编辑:
神奇发生在参数中的this关键字上。该方法由实例调用,但实际上是静态的。调用实例被添加到参数列表中。在不太深入的情况下,它可以在实例上使用静态方法。如果不将其放置在特定命名空间中,则不需要在自己的代码上添加任何内容。

如果
转换
实现了
IEnumerable
,但不实现
IEnumerable
,则首先需要将其转换为通用版本,然后才能使用Linq:

List<GameObject> children = parent
                               .Cast<Transform>()
                               .Select(t => t.gameObject)
                               .ToList();
列出子项=父项
.Cast()
.Select(t=>t.gameObject)
.ToList();

子项。如果“父项”是子项列表,则添加范围(父项)
。编辑:不知道转换实现了IEnumerable。酷!父级是一个转换,很抱歉混淆了。转换是一个特定于Unity的MonoBehavior的类。它包含关于游戏对象的位置、旋转、比例和实现IEnumerable的信息,它会在其子元素上迭代。@Fredrik好吧,我会让它保持最有可能的状态,我更好奇它是否可能,如果是,我想知道如何实现,谢谢你和其他人的帮助:)这是一个很好的问题!这不需要修改转换吗?或者我误解了吗?我不是应该把parent作为GetChildren(parent)的参数传递吗@Alox这是一个“扩展方法”,仅用于修改变换类(请参见第一个参数前的
This
关键字)。你可以像在帖子里一样使用它。@HansKesting。。。好的,那么扩展方法去哪里了?我试了一下,但当它在…@Alox下几行时,它找不到扩展方法。基本上,您需要将它放在一个静态类中,并使用
using
到您想要使用它的类中该类的命名空间中。我有点困惑,为什么将父类强制转换为转换时,它已经是一个转换允许它工作。。。但它是有效的,它回答了我的问题,即如何将其一行…您并没有将
父项
本身强制转换为
转换
Cast
将枚举中的元素强制转换为指定的类型。因为正如@Hans所说,Transform实现的是
IEnumerable
,而不是
IEnumerable
,当访问其功能时,就好像您使用的是
IEnumerable
。它不是
IEnumerable>
,但效果是一样的——您会丢失类型信息。因此,底线是您需要调用
Cast
来满足编译器的要求,告诉它您完全确定集合中的元素实际上是
Transform
s。哇,这太棒了,感谢@Balázs提供的信息,我喜欢学习这些东西,我相信它将来会派上用场:)