如何从给定父节点的树中获取随机项?

时间:2010-04-06 19:47:13

标签: sitecore

我有一个场景,我想随机化一些项目的显示。给定父项,如何随机选择其中一个子项?

当然我可以加载所有的孩子并应用一些随机索引或诸如此类的......但这样效率会非常低。

我想知道这是否效率低下:

Parent.Children [随机(Parent.Children.Count)]

当您访问Parent.Children时,在什么时候加载项目?

2 个答案:

答案 0 :(得分:3)

Item.Children是一个延迟加载的属性,我绝对不会建议你在这里展示的方式使用它。

在发布之前,我做了一些挖掘API,看看是否真的没有办法在没有加载这个属性的情况下获得子项目的数量,但是我真的找不到任何看似“的方式”合法”。只有.HasChildren属性似乎有关 - 它似乎通过做.Children属性已经完成的大部分(但不是全部)工作。

但是,由于它是延迟加载的,因此将属性的结果存储在私有字段中以获得最大效率。我记得曾经在官方开发人员指南中读过这篇文章,如果需要,我可以挖掘出确切的参考资料。

ChildList itemChildren = myItem.Parent.Children;
// Continue doing random() etc here, but using the itemChildren field.

答案 1 :(得分:0)

你手头有整个树状结构吗?然后你可以做一些随机遍历。例如,您可以从二叉树中选择一个随机项,如下所示(伪代码):

sub randomNode(node):
   randomVal = random(0, 3); // random value between 0 and 3

   if(randomVal == 0):
     return randomNode(node.left) if node.left != null else return node;
   elseif(randomVal == 1):
     return randomNode(node.right) if node.right != null else return node;
   else
     return node;

对于n-ary树,你可以这样:

sub randomNode(node):
   randomVal = random(0, 2)

   if(randomVal == 0):
     return randomNode(node.children[random(0, node.children.length)]) if node.children.length != 0 else return node;
   elseif(randomVal == 1):
     return node;

parent.children[random(parent.children.count)]对我来说效率似乎不高;这就是我在上面算法中使用的内容。至于你的上一个问题,我想这取决于你如何实现你的树。如果您自己构建了一个树结构,那么您必须拥有整个树结构。如果您正在使用框架,那么它取决于该框架的实现。