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. 传入的对象正在被操纵、更改和返回,我不能让这种情况发生。我知道我可以创建一个新对象并将其返回,但如果可能的话,我想学习一些新的东西。
4

1 回答 1

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()这将是一个新的集合。

不一定更有效,但可能更优雅(恕我直言)。

于 2013-08-12T20:44:31.273 回答