Używam Unity. Używam IEnumerable.Select(), aby wziąć listę typów i dodać je (jako komponenty) do GameObject. Running to:C# - LINQ Select() wywołuje funkcję dwa razy
var newObjects = types.Select(t => (IGameManager)gameObject.AddComponent(t));
Właściwie dodaje dwa tego samego typu elementów do GameObject mowa, chociaż newObjects zawiera tylko odniesienie do jednego. Drugi stworzony komponent po prostu się unosi, bez zwracania referencji. Running to:
foreach(var t in types)
{
newObjects.Add((IGameManager)gameObject.AddComponent(t));
}
Works, a jedynie dodaje jeden z każdego rodzaju części do GameObject. Ale wygląda trochę brzydko. (IGameManager to interfejs wszystkich typów, których dotyczy implementacja).
Mogę po prostu użyć pętli foreach, ale to nie jest całkowicie wymowne, a poza tym nie mogę znaleźć żadnych artykułów online wyjaśniających to zachowanie, a tym samym moją ciekawość jest coraz lepszy ode mnie.
Moje pytanie brzmi: dlaczego funkcja Select() wywołuje określoną funkcję dwukrotnie na jedno wejście, a zwraca tylko jedną kopię wynikowych danych? I jak mogę naprawić/zapobiec/zrekompensować to zachowanie?
Dzięki!
types.Select (T => (IGameManager) gameObject.AddComponent (t)) ToList() – loneshark99
'Wybierz()' nie wywołuje podanego delegata. Tworzy tylko odroczony wykonany obiekt 'IEnumerable'. I delegate będzie wywoływane za każdym razem, gdy wyliczysz wynikowy obiekt 'IEnumerable'. – PetSerAl