2017-02-17 44 views
2

我想提取一個嵌套對象的不同可能值(名稱,類型)的列表。 如何從下列嵌套集合中獲取屬性名稱及其各自類型的列表?Linq獲取嵌套元素的不同值

的數據結構在C#:

Nodes (List<Node>) 
    - Node1: 
     -Properties (List<NodeProperty>) getter: Node1.Properties 
       -Property1: 
       -Name: "AAA" (string) getter Property1.Name 
       -Type: "string" (string) getter Property1.Type 

實施例:

MyNodes: 
    Node1: 
     Properties 
      Property1: 
       Name: "AAA" 
       Type: "string" 
      Property2: 
       Name: "BBB" 
       Type: "int" 
    Node2: 
     Properties 
      Property1: 
       Name: "CCC" 
       Type: "double" 
      Property2: 
       Name: "DDD" 
       Type: "double" 

結果

List<KeyValuePair<string, string>> result; 

// content of result after the Linq magic: 
// AAA -> string 
// BBB -> int 
// CCC -> double 
// DDD -> double 

如何可以使用LINQ提取此? 提取的不同的名稱制定出這樣的:

List<string> names = MyNodes.SelectMany(n => n.Properties.Select(np => np.Name)).Distinct().ToList(); 
// res: [AAA, BBB, CCC, DDD] 

這是一個良好的開端?

有沒有一個單一的Linq查詢解決方案呢?

編輯

最小測試類和數據:

public class Node{ 
    public List<NodeProperty> Properties; 
} 

public class NodeProperty 
{ 
    public string Name; 
    public string Type; 
}  

var MyNodes = new List<Node> 
{ 
    new Node { 
     Properties = new List<NodeProperty> 
     { 
      new NodeProperty {Name = "node1", Type="string"}, 
      new NodeProperty {Name = "node2", Type="int"}, 
     } 
    }, 

    new Node { 
     Properties = new List<NodeProperty> 
     { 
      new NodeProperty {Name = "node3", Type="string"}, 
      new NodeProperty {Name = "node4", Type="int"}, 
     } 
    }, 
    new Node { 
     Properties = new List<NodeProperty> 
     { 
      new NodeProperty {Name = "node1", Type="string"}, 
      new NodeProperty {Name = "node2", Type="int"}, 
     } 
    } 
}; 
+0

能否請您提供您的數據作爲有效的C#代碼?這樣我們就可以複製粘貼並運行。 – Enigmativity

+0

添加了一些示例數據和類。 – DDan

+0

示例代碼看起來很熟悉:)提供的答案有問題嗎? – AndrewP

回答

3

不實際運行它,調試......這是絕對有可能,我認爲這將類似於:

編輯:

在LinqPad中運行。我得到的查詢是:基於下面的類&初始化 nodes.SelectMany(n => n.Properties.Select(p => new KeyValuePair<string, string>(p.Name, p.Type))).Distinct().ToList();

public class Node{ 
    public List<NodeProperty> Properties; 
} 

public class NodeProperty 
{ 
    public string Name; 
    public string Type; 
}  
var nodes = new List<Node> 
{ 
    new Node { 
     Properties = new List<NodeProperty> 
     { 
      new NodeProperty {Name = "node1", Type="string"}, 
      new NodeProperty {Name = "node2", Type="int"}, 
     } 
    }, 
    new Node { 
     Properties = new List<NodeProperty> 
     { 
      new NodeProperty {Name = "node3", Type="string"}, 
      new NodeProperty {Name = "node4", Type="int"}, 
     } 
    }, 

}; 
+0

這看起來不錯!但是,當2個節點具有相同的屬性時,相同的鍵值將被複制到結果中。這可以是明顯的嗎? – DDan

+1

是的,你可以在.ToList之前或之後添加.Distinct() – AndrewP

+0

完美!謝謝! – DDan