2013-08-12 4 views
1

노드 컬렉션이 있고 각 노드에 부모 노드가있을 수 있습니다. 부모 노드가 존재한다면 그것은 자식으로 삽입하고 싶습니다 (즉 : 부모는 자신의 자식이 될 것입니다).하지만 가능한 경우 linq를 사용하여이 작업을 수행하는 방법을 찾는 데 어려움을 겪고 있습니다.자체를 포함하는 컬렉션 만들기

내 비 LINQ 시도 : 내가 지금까지 작품을 가지고 있지만이 무엇

private IList<IPageNode> addParentNode(IList<IPageNode> nodes) { 
    if (nodes[0].parent == null) return nodes; 
    var parentWithoutChildren = new PageNode { 
      name = nodes[0].parent.name, 
      isNavigable = nodes[0].parent.isNavigable, 
      url = nodes[0].parent.url, 
      children = null, 
      parent = null 
     }; 
    nodes.Insert(0, parentWithoutChildren); 
    return nodes; 
} 

두 가지 문제 :

  1. 그것은 LINQ하지 그리고 내가 그 LINQ가 가장 효율적인 것 있으리라 믿고있어/효과적인 방법.
  2. 전달 된 개체가 조작, 변경 및 반환되고 있으며 그럴 수 없습니다. 나는 새로운 객체를 생성하고 반환 할 수 있다는 것을 알고 있지만 가능한 경우 새로운 것을 배우고 싶습니다.
+9

"linq이 아니기 때문에 가능합니다." - 왜 모든 사람들이 항상 linq가 모든 문제에 대한 해답이라고 생각합니까? 정말로 그렇지 않습니다. LINQ는 올바른 장소에서 사용할 때 훌륭한 도구입니다. 그건 ** ** 당신이 * 다른 장소 *를 사용하여 찾으러 가야한다는 것을 의미하지는 않습니다. 때로는 * 다른 도구 *를 사용해야합니다. –

+1

linq 문에서 원래 모음을 수정하는 것은 좋지 않습니다. 기본 iterables가 반복 자체에 의해 변경되면 반복 프로세스가 취약 해집니다. 적중을 감수하고 사전 처리 단계의 일부로 부모가 아닌 노드를 수집하거나 부모가 아닌 노드로 수행 할 작업을 알 수 있도록 쿼리를 작성하려고합니다. – theodox

+0

@MarcGravell 동의합니다. 아마 나는 그것을 바꿔야 만합니다. 내가 진정으로 말하려고하는 것은 이것이 가장 효과적이고 효과적인 방법으로 이루어지기를 바란다는 것이고, 나는 의혹을 느끼고있다. 그러나 나는 그것이 linq과 함께 있다고 생각하고 있었다. – bflemi3

답변

2

질문 : 동일한 객체 (및 추가 객체)가 포함 된 다른 목록을 반환하겠습니까, 아니면 새 객체의 새 목록을 반환 하시겠습니까?

전자를 가정 :

public static IEnumerable<IPageNode> WithClonedParent(this IList<IPageNode> list) 
{ 
    var newParent = list.First().CloneParentIfSet(); 
    if (newParent) 
    { 
     yield return newParent; 
    } 
    foreach (var node in list) 
    { 
     yield return node; 
    } 
} 

CloneParentIfSet는 현재 new PageNode 성명에서 어떤 기능을 수행합니까 IPageNode에 대한 확장 방법이 될 수 있습니다.

다음과 같이 사용할 수 있습니다 : nodes.WithClonedParent() 이것은 새로운 컬렉션이 될 것입니다.

반드시 더 효율적 일 필요는 없지만 좀 더 우아 할 수도 있습니다 (IMHO).

관련 문제