Обновление : Хаха, вау, это совершенно неправильно, я только что понял (поскольку в этом не делает то, что вы просили). Не бери в голову - похоже, ты уже получил правильный ответ:)
Мне кажется, я понимаю вашу проблему. Дайте мне знать, если я что-то не так делаю.
У вас есть NodeType
класс, который выглядит примерно так:
class NodeType
{
public string Name { get; }
public NodeType Parent { get; }
public int OwnderId { get; }
}
Первым делом было бы написать функцию, которая принимает параметр NodeType
и, учитывая некоторую перечисляемую коллекцию NodeType
объектов, возвращает все свои потомки рекурсивным способом:
IEnumerable<NodeType> GetNodeChildren(NodeType node, IEnumerable<NodeType> nodes)
{
var children = nodes.Where(n => n.Parent == node);
if (children.Any())
{
foreach (NodeType child in children)
{
yield return child;
var grandchildren = GetNodeChildren(child);
foreach (NodeType grandchild in grandchildren)
{
yield return grandchild;
}
}
}
}
Далее: напишите функцию, которая принимает объект NodeType
и находит наивысшего потомка с указанным OwnerId
. Это действительно довольно простая операция, поэтому я даже не буду определять правильную функцию; Я просто использую лямбду:
Func<NodeType, int, NodeType> findHighestDescendent = (node, id) => {
return GetNodeChildren(node).FirstOrDefault(child => child.OwnerId == id);
};
Теперь для любого заданного значения Id найти тривиальное совпадение довольно просто NodeType
:
int id = 10; // just for example
NodeType highestOwnedNode = nodes
.Select(n => findHighestDescendent(n, id))
.FirstOrDefault(n => (n != null));