No estoy seguro de cómo llamarlo, pero supongamos que tiene una clase que tiene este aspecto:Cómo "desenrollar" una estructura "recursivo"
class Person
{
public string Name;
public IEnumerable<Person> Friends;
}
A continuación, tiene una persona y que desea "desenrollar" esta estructura de manera recursiva, por lo que terminas con una sola lista de todas las personas sin duplicados.
¿Cómo harías esto? Ya he hecho algo que parece estar funcionando, pero tengo curiosidad por ver cómo lo harían los demás y especialmente si hay algo integrado en Linq que puede usar de una manera inteligente para resolver este pequeño problema :)
Aquí está mi solución:
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> subjects, Func<T, IEnumerable<T>> selector)
{
// Stop if subjects are null or empty
if(subjects == null)
yield break;
// For each subject
foreach(var subject in subjects)
{
// Yield it
yield return subject;
// Then yield all its decendants
foreach (var decendant in SelectRecursive(selector(subject), selector))
yield return decendant;
}
}
se usaría algo como esto:
var people = somePerson.SelectRecursive(x => x.Friends);
ve bien para mí. – cjk
Me falta algo ... si tienes bucles allí, ¿se detendrá alguna vez? – Kobi
@Kobi: Esto se hace por 'if (! Subjects.Any()) yield break;' – Oliver