Как «развернуть» «рекурсивную» структуру
Не знаю, как это назвать, но скажем, у вас есть класс, который выглядит так:
class Person
{
public string Name;
public IEnumerable Friends;
}
У тебя тогда есть человек и ты хочешьраскатать» эта структура рекурсивно, так что вы получите единый список всех людей без дубликатов.
Как бы вы это сделали? Я уже сделал что-то, что, кажется, работает, но мне любопытно посмотреть, как это сделают другие, особенно если есть что-то встроенное в Linq, которое вы можете использовать умным способом для решения этой маленькой проблемы :)
Вот мое решение:
public static IEnumerable SelectRecursive(this IEnumerable subjects, Func 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);