Έχουν δημοσιευτεί
Κυριακή, 23 Δεκεμβρίου 2007 4:46 μμ
από το μέλος
PALLADIN
Πρόσφατα, χρειάστηκε να βρω τ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);
}
}