我正在使用Unity。我使用IEnumerable.Select()来获取类型列表,并将它们(作为组件)添加到GameObject中。 运行此:C#LINQ Select()调用函数两次
var newObjects = types.Select(t => (IGameManager)gameObject.AddComponent(t));
实际上增加了相同类型的组分与游戏对象在问题的,虽然只newObjects包含于一个的引用。另一个创建的组件只是浮动,而不返回引用。 运行此:
foreach(var t in types)
{
newObjects.Add((IGameManager)gameObject.AddComponent(t));
}
Works和只会增加每种组件类型的游戏对象中的一个。但是,它看起来有点丑。 (IGameManager是一个接口,所有类型的问题实现。)
我可以只使用foreach循环,但这不完全雄辩,此外,我找不到任何文章在线解释此行为,因此我的好奇心越来越好了。
所以,我的问题是:为什么Select()每次输入调用指定的函数两次,但只返回结果数据的一个副本?我如何解决/防止/补偿这种行为?
谢谢!
types.Select(T =>(IGameManager)gameObject.AddComponent(t))的ToList() – loneshark99
'Select()'不会调用提供的委托。它只构造延迟执行的'IEnumerable'对象。每次枚举结果的IEnumerable对象时都会调用委托。 – PetSerAl