2013-08-12 6 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. Итерационный процесс становится хрупким, если исходные итерации изменяются самой итерацией. Вероятно, вы захотите взять удар и либо собрать неровные узлы как часть этапа предварительной обработки, либо просто написать свой запрос, чтобы он знал, что делать с нечеткими узлами. – 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 может быть метод расширения для IPageNode, который делает то, что вы сейчас делаете в new PageNode заявлении.

Тогда вы можете использовать его следующим образом: nodes.WithClonedParent() который будет новой коллекцией.

Не обязательно более эффективный, но, возможно, немного более элегантный (ИМХО).

Смежные вопросы