2010-04-06 6 views
0

일부 항목의 표시를 무작위로 지정하려는 시나리오가 있습니다. 부모 항목이 주어지면 하위 항목 중 하나를 임의로 선택하려면 어떻게해야합니까?부모 노드가 주어진 트리에서 임의의 항목을 가져 오는 방법은 무엇입니까?

물론 모든 아이들을로드하고 임의의 인덱스 또는 기타 등등을 적용 할 수는 있지만 너무 비효율적입니다. 이 비효율적 인 경우

궁금하네요 :

Parent.Children [임의 (Parent.Children.Count)]?

언제 Parent.Children에 액세스 할 때 항목이로드됩니까?

답변

2

Item.Children은 게으른로드 속성이므로 여기에 표시하는 방식대로 정확하게 사용하지 않는 것이 좋습니다.

게시하기 전에이 속성을로드하지 않고 childitem 수에 도달 할 수있는 방법이 실제로 없는지 API를 통해 조사했습니다. 그러나 아아 나는 실제로 볼 수있는 방법을 찾지 못했습니다. "본격적인". .HasChildren 속성 만 관련되어있는 것처럼 보이며 .Children 속성이 이미 수행 한 것의 전부 (전부는 아님)를 수행하여 작동하는 것으로 보입니다.

그러나 지연된로드 인 경우 최대 효율성을 위해 개인 필드에 속성 결과를 저장하십시오. 나는 이것을 공식 개발자 가이드 라인에서 한 번 읽어 보았고 필요할 경우 정확한 참조를 찾아 낼 수있다.

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

아주 늦은 밤 입력 중 일부를 명확히하기 위해 .Children 속성은 게으른로드되지 않으며 액세스 할 때마다로드됩니다. 일반적으로 Lazy Load는 첫 번째 사용 후 속성 값 캐싱을 의미하지만 여기에는 해당되지 않습니다. –

0

전체 트리 구조가 준비되어 있습니까? 그렇다면 임의의 순회를 수행 할 수 있습니다. 예를 들어, 임의 때문에 (의사 코드)와 같은 이진 트리에서 항목을 선택할 수 있습니다 :

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; 

하 :는 n 진 트리를 들어

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; 

을, 당신은 이런 식으로 뭔가를 할 수 parent.children[random(parent.children.count)]은 나에게 비효율적이지 않습니다. 그것은 위의 알고리즘에서 사용한 것입니다. 마지막 질문까지, 나는 당신이 당신의 나무를 어떻게 구현 했느냐에 달려 있다고 생각합니다. 만약 당신이 스스로 나무 구조를 만들었다면 당신은 전체 나무 구조를 가져야 만합니다. 프레임 워크를 사용하는 경우 해당 프레임 워크의 구현에 따라 다릅니다.

+0

감사합니다. Vivin,하지만 이것은 Sitecore API에 관한 것입니다. 미안해. 내가 분명히하지 않았어. – Bryan

+0

걱정할 필요가 없습니다. Mark가 말했듯이,이 필드는 게으른로드가 발생하여 얼마나 많은 어린이가 있는지를 알 수있는 방법이 없습니다. load-as-required는 위의 알고리즘을 어떤 식 으로든 변경하지 않을 것이라고 생각합니다. –

관련 문제