Umbraco-CMS中一种特殊的C#树算法

Umbraco-CMS中一种特殊的C#树算法,c#,algorithm,tree,content-management-system,umbraco,C#,Algorithm,Tree,Content Management System,Umbraco,我正在创建一个特殊的树算法,我需要一些关于我目前拥有的代码的帮助,但是在你看它之前,请让我解释一下它真正的用途 我有一个树结构,并且我正在与一个节点(树中的任何节点(这些节点是Umbraco CMS类))交互,因此在交互过程中,我将树渲染到顶部(到根),并在全局集合中获取这些值(List,在这种特殊情况下)。到目前为止,还可以,但是在与另一个节点进行其他交互时,我必须检查列表,如果它已经包含单击节点的父节点,如果它确实包含每个父节点,并且它不包含此节点,则交互处于最低级别(我希望您仍然与我在一起

我正在创建一个特殊的树算法,我需要一些关于我目前拥有的代码的帮助,但是在你看它之前,请让我解释一下它真正的用途

我有一个树结构,并且我正在与一个节点(树中的任何节点(这些节点是Umbraco CMS类))交互,因此在交互过程中,我将树渲染到顶部(到根),并在全局集合中获取这些值(
List
,在这种特殊情况下)。到目前为止,还可以,但是在与另一个节点进行其他交互时,我必须检查列表,如果它已经包含单击节点的父节点,如果它确实包含每个父节点,并且它不包含此节点,则交互处于最低级别(我希望您仍然与我在一起?)

不幸的是,在Umbraco CMS中调用
Contains()
函数无法检查列表是否已包含值,即使我为检查添加了
Contains()
函数,列表也会再次添加相同的值

如果他已经遇到这样的问题,谁能帮我一下?我将
Contains()
函数替换为
函数,但
Union
函数除外,它们产生相同的结果-它们确实包含重复项

var currentValue = (string)CurrentPage.technologies;
    List<Node> globalNodeList = new List<Node>();
    string[] result = currentValue.Split(',');
    foreach (var item in result)
    {
        var node = new Node(int.Parse(item));
        if (globalNodeList.Count > 0)
        {
            List<Node> nodeParents = new List<Node>();

            if (node.Parent != null)
            {
                while (node != null)
                {
                    if (!nodeParents.Contains(node))
                    {
                        nodeParents.Add(node);
                    }
                    node = (Node)node.Parent;
                }
            }

            else { globalNodeList.Add(node); }

            if (nodeParents.Count > 0)
            {
                var differences = globalNodeList.Except<Node>(globalNodeList);
                globalNodeList = globalNodeList.Union<Node>(differences).ToList<Node>();
            }
        }
        else
        {
            if (node.Parent != null)
            {
                while (node != null)
                {
                    globalNodeList.Add(node);
                    node = (Node)node.Parent;
                }
            }
            else
            {
                globalNodeList.Add(node);
            }
        }
    }
}
var currentValue=(字符串)CurrentPage.technologies;
List globalNodeList=新列表();
字符串[]结果=currentValue.Split(',');
foreach(结果中的var项目)
{
var节点=新节点(int.Parse(item));
如果(globalNodeList.Count>0)
{
List nodeParents=新列表();
如果(node.Parent!=null)
{
while(节点!=null)
{
如果(!nodeParents.Contains(node))
{
添加(节点);
}
node=(node)node.Parent;
}
}
else{globalNodeList.Add(node);}
如果(nodeParents.Count>0)
{
var差异=全球节点列表。除了(全球节点列表);
globalNodeList=globalNodeList.Union(differences.ToList();
}
}
其他的
{
如果(node.Parent!=null)
{
while(节点!=null)
{
globalNodeList.Add(节点);
node=(node)node.Parent;
}
}
其他的
{
globalNodeList.Add(节点);
}
}
}
}

如果我理解你的问题,你只想看看某个特定节点是否是另一个节点的祖先。如果是,只需(字符串)检查节点的路径属性。path属性是逗号分隔的字符串。不需要自己创建列表

只有myNode.Path.Contains(“,1001”)可以工作

小评论

  • 如果使用的是Umbraco 6,请使用IPPublishedContent而不是节点
  • 如果你想像你一样建立一个列表,我宁愿你可以为Umbraco助手提供多个Id,让Umbraco(从缓存)建立列表 对于第二句话,您可以这样做:

    var myList = Umbraco.Content(1001,1002,1003);
    
    或者使用数组/列表

    var myList = Umbraco.Content(someNode.Path.Split(','));
    
    由于您正在向上爬到根目录,因此可能需要添加一个.Reverse()

    有关UmbracoHelper的更多信息,请参见文档:

    如果您使用的是Umbraco 4,则可以使用@Library.NodesById(…)