Exemplo n.º 1
0
        /// <summary>
        /// 判断指定节点是否为指定容器的子代。
        /// </summary>
        /// <param name="node">要判断的节点</param>
        /// <param name="collection">要判断的容器</param>
        /// <returns>若节点位于容器的子代,则返回 true ,否则返回 false 。</returns>
        /// <remarks>
        /// 出于性能考虑, IsDescendantOf( this node, container ) 方法检查节点的所有父级是否包含指定的容器,但对于IHtmlCollection来说,即使节点是其子代,其也不会在其父级中出现。
        /// 所以这是针对 IHtmlCollection 的一个特定实现,而 IsDescendantOf( this IHtmlNode, IHtmlContainer ) 方法发现第二个参数是IHtmlCollection时,也会自动调用此重载
        /// </remarks>
        internal static bool IsDescendantOf(this IHtmlNode node, IHtmlCollection collection)
        {
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }

            if (collection == null)
            {
                throw new ArgumentNullException("collection");
            }

            if (collection.Nodes().Contains(node))
            {
                return(true);
            }

            if (collection.Nodes().OfType <IHtmlContainer>().Any(child => node.IsDescendantOf(child)))
            {
                return(true);
            }

            return(false);
        }