SORU
13 AĞUSTOS 2009, PERŞEMBE


İç içe verim IEnumerable dönüş

Kart doğrulama hatası almak için aşağıdaki işlevi var. Benim sorum GetErrors ile ilgili ilgilidir. Her iki yöntem de aynı döndürme türünü IEnumerable<ErrorInfo>.

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    var errors = GetMoreErrors(card);
    foreach (var e in errors)
        yield return e;

    // further yield returns for more validation errors
}

Onlar aracılığıyla sıralamak zorunda kalmadan GetMoreErrors tüm hataları dönmek mümkün mü?

Bunu düşünerek bu aptalca bir soru, ama yanlış gitmiyorum emin olmak istiyorum.

CEVAP
13 AĞUSTOS 2009, PERŞEMBE


Kesinlikle aptalca bir soru değil, ve F bir şey değil# bütün toplama vs için yield! destekler 6* *tek bir öğe için. (Bu kuyruk özyineleme açısından...) çok yararlı olabilir

C desteklenen değil ne yazık ki#.

Eğer varsa birkaç yöntem her dönen varsa ancak, bir IEnumerable<ErrorInfo>, Enumerable.Concat kodunuzu daha kolay hale getirmek için kullanabilirsiniz:

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return GetMoreErrors(card).Concat(GetOtherErrors())
                              .Concat(GetValidationErrors())
                              .Concat(AnyMoreErrors())
                              .Concat(ICantBelieveHowManyErrorsYouHave());
}

Gerçi iki uygulamaları arasında çok önemli bir fark var: bu yöntemler arayacakhemensadece bir anda döndü kullanımına biri kullanacak olsa bile. Varolan kodunuzu önce bile GetMoreErrors() her işi sarhoş olana kadar bekleyeceksorarbir sonraki hatalarla ilgili.

Genellikle bu önemli değil, ama ne zaman ne anlama değer.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • brokenbellsVEVO

    brokenbellsV

    11 EYLÜL 2009
  • Doug Bernards

    Doug Bernard

    7 Kasım 2007
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007