Как «развернуть» «рекурсивную» структуру
Не знаю, как это назвать, но скажем, у вас есть класс, который выглядит так:
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);