Не уверен, как это назвать, но скажите, что у вас есть класс, который выглядит так:
class Person
{
public string Name;
public IEnumerable<Person> Friends;
}
Затем у вас есть человек, и вы хотите "развернуть" эту структуру рекурсивно, чтобы в итоге появился один список всех людей без дубликатов.
Как вы это сделаете? Я уже сделал что-то, что, похоже, работает, но мне любопытно посмотреть, как это будут делать другие, и особенно если в Linq есть что-то встроенное для вас, вы можете использовать умный способ решить эту небольшую проблему:)
Вот мое решение:
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;
}
}
Будет использовано следующее:
var people = somePerson.SelectRecursive(x => x.Friends);