W moim projekcie mam MyClass
, który implementuje IMyClass
. Muszę zwrócić listę IMyClass
, przekształcając listę innych elementów. Dla uproszczenia załóżmy, że mogę utworzyć MyClass
po prostu przekazując inny element do jego konstruktora, tj. new MyClass(item)
.Czy powinienem rzucić w moje lambda lub rzucić IEnumerable?
Rozważmy następujące dwa wiersze, które (o ile wiem) produkują ten sam wynik:
var option1 = items.Select(item => new MyClass(item)).Cast<IMyClass>().ToList()
var option2 = items.Select(item => new MyClass(item) as IMyClass).ToList()
Wydaje mi się, że opcja nr 1 wymagałoby podwójne wyliczenie, raz do oddania wszystkie pozycje do mojego interfejsu i raz, aby wygenerować listę. Jeśli mam rację, opcja nr 2 byłaby mądrzejsza. Jednakże, mam nigdy widziałem jakikolwiek kod używając czegoś jak opcja # 2, i staram się zakładać, że nie jestem wystarczająco inteligentny, by wymyślić coś sprytnego, że reszta społeczności C# nie.
Na marginesie myślę, że opcja nr 2 jest bardziej estetyczna, ale to tylko ja.
Moje pytanie brzmi: jest moją opcją nr 2 lepszym pomysłem, jak myślę, że jest? Czy są jakieś zaginięcia, których mi brakuje, lub inne powody, dla których chciałbym pozostać przy opcji nr 1? A może porównuję dwa głupie pomysły, gdy brakuje mądrzejszego trzeciego, którego kompletnie brakuje?
Nie zapominaj, że przeliczniki są leniwe i kompozycyjne! Opcja 1 nie spowoduje dwukrotnego wyliczenia jej ... –
Dlaczego musisz rzutować, jeśli 'MyClass' implementuje' IMyClass'? –
Wiesz, że zawsze możesz przeliterować typy bez wnioskowania? To znaczy, 'var result = items.Wybierz (x => new MyClass (x)). ToList();' To zwróci 'IEnumerable ' :) –