C# 基于变换的简化foreach
是否可以使用Linq简化以下代码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); }
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提供的信息,我喜欢学习这些东西,我相信它将来会派上用场:)