更新:哈哈,哇,这完全错了,我刚刚意识到(因为它没有按照你的要求做)。没关系——看起来你已经得到了正确的答案,反正:)
我想我理解你的问题。如果我有什么问题,请告诉我。
你有一个看起来像这样的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 的最高后代。这确实是一个非常简单的操作,所以我什至不会定义一个合适的函数;我将只使用一个 lambda:
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));