2012-11-15 11 views
5

Czy istnieje standardowy wzorzec zwrotu plonów dla wszystkich pozycji w ramach zmiennej?Jaki jest właściwy wzorzec do obsługi obiektów podlegających wymianie z zyskiem zwrotu?

Częściej niż chciałbym znaleźć niektóre z moich kodu odzwierciedlającego następujący wzór:

public IEnumerable<object> YieldReturningFunction() 
    { 

     ... 
     [logic and various standard yield return] 
     ... 

     foreach(object obj in methodReturningEnumerable(x,y,z)) 
     { 
      yield return obj; 
     } 

    } 

Wyraźne użycie pętli foreach wyłącznie do powrotu wynikach przeliczalny cuchnie zapachy kodu do mnie.

Oczywiście mogę zrezygnować z korzystania z powrotu plastyczności rosnącą złożoność mojego kodu jawnie budownictwa i Enumerable i dodając wynik każdego standardowego zwrotu zysk do niej, jak również dodanie zakres wyników methodReturningEnumerable . Byłoby to niefortunne, ponieważ miałem nadzieję, że istnieje lepszy sposób zarządzania wzorem zwrotu z inwestycji.

+1

Pytasz o 'foreach wydajności', którego nie ma. – SLaks

+3

możliwy duplikat [zagnieżdżonego zwrotu plonu z IEnumerable] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – Euphoric

+0

możliwy duplikat [Yield Return Many?] (Http: // stackoverflow .com/questions/3851997/yield-return-many) – nawfal

Odpowiedz

5

Nie, nie da się tego obejść.

Ta funkcja została zamówiona i nie jest to zły pomysł (yield foreach lub jej odpowiednik występuje w innych językach).

W tym momencie Microsoft po prostu nie przydzielił czasu i pieniędzy na jego wdrożenie. Mogą lub nie mogą wdrożyć go w przyszłości; Zgaduję (bez żadnych faktów), że jest gdzieś na liście do zrobienia; chodzi po prostu o to, czy/kiedy wystarczająco wysoko na tej liście zostanie faktycznie zaimplementowane.

Jedyną możliwą zmianą, jaką mogłem zobaczyć, byłoby przekonwertowanie wszystkich pojedynczych yield returns od góry metody do ich własnej przeliczalnej metody zwracania, a następnie dodanie nowej metody, która zwraca połączenie tej metody i methodReturningEnumerable(x,y,z) . Czy byłoby lepiej; nie, prawdopodobnie nie. Numer Concat dodaje się z powrotem tak samo, jak zaoszczędziłbyś, jeśli nie więcej.

+1

Zaznaczam to jako akceptowaną odpowiedź nie dlatego, że daje mi to odpowiedź, której szukałem, ale dlatego, że wyjaśnia ona wystarczająco dobrze, dlaczego odpowiedź, której szukam jeszcze (jeszcze) nie istnieje. – rheone

2

Nie można tego zrobić. Jednak nie jest tak źle. Możesz go skrócić do pojedynczej linii:

foreach (var o in otherEnumerator) yield return o; 

Niepowiązana uwaga: powinieneś uważać na to, jaką logikę uwzględniasz w generatorach; wszystkie wykonania są odłożone do czasu wywołania GetEnumerator() na zwróconym IEnumerable. Łapię się rzucanie w ten sposób niepoprawnie tak często, że myślałem, że warto o tym wspomnieć. :)

Powiązane problemy