创建包含自身的集合

时间:2013-08-12 20:07:08

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

1 个答案:

答案 0 :(得分: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()这将是一个新的集合。

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