Дано: Некие контексты, которые выстроены в цепочку и позволяют искать внутри себя некие "объекты":
interface IContext
{
// Возвращает "следующий" контекст или "null",
// если текущий контекст последний в цепочке.
IContext GetNext();
// Возвращает удовлетворяющий значению параметра "criteria"
// объект или "null", если объект не найдён.
object FindItem(object criteria);
}
как видно, навигация по цепочке осуществляеься посредством вызова метода GetNext() от имеющегося экземпляра контекста.
Цепочка гарантированно не зациклена, её валидность проверять не нужно.
Требуется: в данной цепочке отыскать первый же объект, удовлетворяющий известному критерию, или же установить, что ни один из объектов не удовлетворяет критерию.
То есть нужно написать функцию
object FindInChain(IContext start, object criteria) {
// Требуется пройтись по всей иерархии контекстов
// и вернуть первый же объект, для которого IContext::FindItem(criteria)
// вернёт не пустой результат. или же вернуть null, если подходящий элемент
// не был найден ни в одном из контекстов цепочки.
}
Если вам понадобятся дополнительные методы, пожалуйста.
Собственно
интересует, что бы уважаемые коллеги написали внутри тела функции, в предположении, что это метод проекта, над которым они в данный момент работают.
Если бы без указанного только что ограничения ваш код оказался бы другим, то это тем более интересно с описанием того, почему примеры различаются.
P.S. Вариант, который мне в первую очередь пришёл в голову и весьма мне симпатичен,
показался мне же излишне сложным и, наверняка, для кого-то непривычным. Потом, я надеюсь, позже мне его раскритикуют

а пока любопытно взглянуть на привычные другим способы решения такой простой задачи.