Έχουν δημοσιευτεί Κυριακή, 23 Δεκεμβρίου 2007 4:46 μμ από το μέλος PALLADIN

Unfold Me

Πρόσφατα, χρειάστηκε να βρω τo Inheritance Chain κάποιου type, απλό και βαρετό... αλλα
(για να το κάνω πιο ενδιαφέρον) σκέφτηκα ότι είναι μια κλασική περίπτωση "αναμορφισμου", και ότι αυτό που χρειάζομαι είναι την κλασική συνάρτηση Unfold.
Με τα extension methods μπορώ να προσθέσω την ανάλογη δυνατότητα, και ο τελικός κώδικας να γίνει small and readable (I love C#)

  static class Program
  {
    static IEnumerable<T> Unfold<T>(this T value, Func<T, T> func)
    {      
      while(true)
      {
        yield return value;
        value = func(value);
      }
    }

    static IEnumerable<T> WhileIsNotNull<T>(this IEnumerable<T> values)
    {
      return values.TakeWhile(n => n != null);
    }

    static void Main(string[] args)
    {
      foreach (var value in typeof(int).Unfold(type => type.BaseType).WhileIsNotNull())
        Console.WriteLine(value);
    }
  }

Share


Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια

Σχόλια:

 

Mitsaras έγραψε:

Wow! Εκπληκτική υλοποίηση! Βέβαια, εγώ θα υλοποιούσα μια απλουστευμένη recursive λύση, καθώς το μυαλό μου δεν έχει μπει πλήρως στο functional mentality.

Νίκο, συνέχισε με τα παραδείγματα, κάνεις φοβερή δουλειά.

Ιανουαρίου 8, 2008 12:34 μμ
 

PALLADIN έγραψε:

Σε ευχαριστώ πολύ...να είσαι καλά φιλε μου...

Your wish is my command

Ιανουαρίου 8, 2008 6:56 μμ

Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο)
απαιτούμενο
προαιρετικό
απαιτούμενο
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image