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

  • Kat Krazy

    Kat Krazy

    12 Kasım 2010
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008
  • schmittastic

    schmittastic

    9 EYLÜL 2009