2017-07-04 104 views
0

我有功能的GetChildren,因爲他們需要在樹視圖返回所有的子節點,在結構列表 獲取從對象C#

public static object GetChildrenNodes(IEnumerable<NodeDto> aNodes, Guid aNodeGuid) 
    { 
     var childrens = from childrenNode in aNodes 
         where (childrenNode.NodeParentGuid == aNodeGuid) 
         select new 
         { 
          id = childrenNode.NodeGuid, 
          text = childrenNode.Label, 
          nodes = (aNodes.Count(x => x.NodeParentGuid == childrenNode.NodeGuid) > 0) ? GetChildrenNodes(aNodes, childrenNode.NodeGuid) : null 
         }; 

     return childrens; 
    } 

該函數必須保持不變,因爲TreeView需要這種類型的對象來構建它自己。

我想用相同的函數來獲取節點刪除的GUID,所以我有:

object nodesList = GetChildrenNodes(nodeList, aNodeGuid); 

的事情是我想從對象nodesList的「ID」 S List<Guid> guids,所以我請你幫忙。

+0

爲什麼要使用相同的方法,因爲他們做了非常不同的事情? –

回答

1

正確的方式做,這是定義一個樹節點類,並用它來代替匿名類......如果你真的想你就可以調用此方法後做了。選擇。

這就是說,如果你堅持 - 你可以嘗試鑄造動態?然後鑄造Id屬性......雖然這令我生厭,你真的應該只定義一個TreeNode類並用它來代替匿名類的......

List<Guid> guids = new List<Guid>(); 
for (var node in nodeList){ 
    guids.Add((Guid)(node as dynamic).Id); 
} 
2

我會避免使用相同的方法。你有兩個不同的要求:

  • 構建匿名類型的使用集合中的UI
  • 建立給定節點ID

的孩子GUID的列表(我假設你只需要直接孩子,而不是所有的後代?目前尚不清楚。)

它們可能具有相同的過濾器,但是這就是全部。我建議找出共同部分(過濾),然後有兩種不同的方法稱之爲:

private static IEnumerable<NodeDto> FindChildren(
    IEnumerable<NodeDto> allNodes, Guid parentId) => 
    allNodes.Where(node => node.NodeParentGuid == parentId); 

public static object GetChildrenNodes(IEnumerable<NodeDto> allNodes, Guid parentId) => 
    FindChildren(allNodes, parentId).Select(node => 
    { 
     id = childrenNode.NodeGuid, 
     text = childrenNode.Label, 
     nodes = allNodes.Any(x => x.NodeParentGuid == node.NodeGuid) 
      ? GetChildrenNodes(allNodes, node.NodeGuid) : null 
    }); 

public static List<Guid> FindChildIds(IEnumerable<NodeDto> allNodes, Guid parentId) => 
    FindChildren(allNodes, parentId).Select(node => node.NodeGuid).ToList();