Мне дали этот вопрос на собеседовании в последнее время и не могли понять, как это сделать элегантно. С тех пор, это было неприятно для меня, и я не могу разобраться, если у него недостаток знаний о какой-то "современной" технике/технологии, о которой я не знаю, или если я просто глуп. Любые советы были бы очень желанными.
Проблема
Представьте себе простую иерархию классов:
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
.
Я реализовал, почти не задумываясь, простое рекурсивное решение, но, конечно, из-за того, как связанные объекты связаны друг с другом, все не так просто, как все это.
Попытайтесь, чтобы я не мог придумать чистый способ сделать это, и мой пост-интервью Googlings предположил, что мне нужно делать что-то, что есть (для меня, с только рабочим знанием LINQ
и List<T>
) что-то значительно более технически совершенное, чем то, что я делал в последнее десятилетие или около того. Это так? Или я должен думать о выходе из разработки программного обеспечения на том основании, что я мусор на нем?
Update
Спасибо всем вам за ваши ответы/предложения. Я принял @Daniel Hilgarth ответ прежде всего потому, что это был единственный, который я мог искренне понять: -o