Недавно мне дали этот вопрос на собеседовании, и я не мог понять, как это сделать элегантно.С тех пор, это не давало мне покоя, и я не могу понять, является ли это недостатком знаний о какой-то «современной» технике / технологии, о которой я не знаю, или я просто тупой.Любой совет будет очень кстати.
Проблема
Представьте себе простую иерархию классов:
abstract class Person {
public string Name { get; set; }
}
class Child : Person { }
class Parent : Person {
public List<Person> Children { get; set; }
}
class Ancestor : Parent { }
Проблема заключается в том, как обойти иерархию таких объектов и распечататьиз всех людей, с которыми сталкиваются.Таким образом, для следующего сценария:
Ancestor myAncestor = new Ancestor {
Name = "GrandDad",
Children = new List<Person> {
new Child { Name = "Aunt" },
new Child { Name = "Uncle" },
new Parent {
Name = "Dad",
Children = new List<Person> {
new Child { Name = "Me" },
new Child { Name = "Sister" }
}
}
}
};
результат должен быть примерно таким:
GrandDad
- Aunt
- Uncle
- *Dad
-Me
-Sister
Вся обработка должна быть выполнена в одном методе, который принимает один параметр типа Ancestor
.
Я реализовал, почти не задумываясь, простое рекурсивное решение, но, разумеется, из-за того, что соответствующие объекты связаны друг с другом, не так просто, как все это.
Как бы я ни пытался, я не могу придумать, как это сделать, и мое пост-интервью Гуглингс предложил мне сделать что-то, что (для меня только с рабочим знанием LINQ
и List<T>
) что-то значительноболее технически продвинутый, чем тот вид web-разработки, который я делал последние десять лет или около того.Это тот случай?Или мне стоит подумать о том, чтобы выйти из процесса разработки программного обеспечения на том основании, что я в нем всякую ерунду?
Обновление
Спасибо вам всем за ваши ответы / предложения.Я принял ответ @Daniel Hilgarth прежде всего потому, что он был единственным, который я мог по-настоящему понять: -o