2010-04-06 42 views
0

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

当然,我可以加载所有的孩子,并应用一些随机索引或什么...但这将是非常低效率。

我想知道如果这也是低效的:

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

当您访问Parent.Children时,哪些项目会被加载?

回答

2

Item.Children是一个懒加载的属性,我绝对不建议完全按照您在这里展示的方式使用它。

在发布之前,我通过API进行了一些挖掘,看看是否真的没有办法在不加载此属性的情况下获得子项数,但是,我无法真正找到任何看起来似乎“合法”。只有.HasChildren属性似乎涉及 - 似乎通过做大部分(但不是全部).Children属性已经工作。

但是,由于它是延迟加载的,因此将该属性的结果存储在专用字段中以获得最大效率。我记得有一次在官方的开发者指南中读到了这一点,如果需要的话,我可以挖掘出确切的参考。

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

只是为了澄清我的一些深夜打字... .Children属性不是延迟加载,每次访问时都会加载它。通常,懒惰加载意味着在第一次使用后缓存属性值,但这不是这种情况。 – 2010-04-07 11:05:34

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叉树,你可以有这样的事情:

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)]对我来说似乎并不低效;这是我在上面的算法中使用的。至于你最后的问题,我想这取决于你如何实现你的树。如果你自己建立了一个树形结构,那么你必须拥有整个树形结构。如果你使用的是框架,那么它取决于该框架的实现。

+0

感谢Vivin,但这是专门关于Sitecore API的。对不起,我没有说清楚。 – Bryan 2010-04-06 20:57:20

+0

不用担心!正如马克所说,它看起来像这个领域得到延迟加载,所以没有办法告诉有多少孩子。我认为按需加载不会以任何方式改变上述算法。 – 2010-04-06 21:18:59

相关问题