2012-07-18 72 views
1

我不確定的確切的術語,但我試圖做的使用LINQ是「切換」字典的鍵與其子的鍵。使用LINQ切換父鍵與二維字典的子鍵

這是集合我有作爲輸入:

Key:HeaderID Value: 
Key:ItemID Value:Object 
Key:ItemID Value:Object 
Key:ItemID Value:Object 
Key:HeaderID Value: 
Key:ItemID Value:Object 
Key:ItemID Value:Object 
Key:ItemID Value:Object 
Key:HeaderID Value: 
Key:ItemID Value:Object 
Key:ItemID Value:Object 
Key:ItemID Value:Object 

這是我想作爲輸出的集合:

Key:ItemID Value: 
Key:HeaderID Value:Object 
Key:HeaderID Value:Object 
Key:HeaderID Value:Object 
Key:ItemID 
Key:HeaderID Value:Object 
Key:HeaderID Value:Object 
Key:HeaderID Value:Object 
Key:ItemID 
Key:HeaderID Value:Object 
Key:HeaderID Value:Object 
Key:HeaderID Value:Object 

我已經創建的代碼在VB.net:

Dim objInput As Dictionary(Of String, Dictionary(Of String, Object)) = fakefunction() 
    ' ItemID -> HeaderID ColumnValue 
    Dim objOutput As New Dictionary(Of String, Dictionary(Of String, Object)) 

    For Each strHeaderID As String In objInput.Keys 

     Dim objColumnValuesPerItem As Dictionary(Of String, Object) = objInput(strHeaderID) 

     For Each strItemID As String In objColumnValuesPerItem.Keys 

      Dim objColumnValue As Object = objColumnValuesPerItem(strItemID) 

      If Not objOutput.ContainsKey(strItemID) Then 
       objOutput.Add(strItemID, New Dictionary(Of String, Object)) 
      End If 

      objOutput(strItemID).Add(strHeaderID, objColumnValue) 

     Next 

    Next 

我問這個問題的原因是純粹的教育,我試圖用LINQ來獲得轉換爲正確的列表,只有我沒有創造任何非常複雜和長的LINQ語句。

回答

2

我不知道任何VB.Net,但我認爲這應該做你想做的。

Dim objOutput As Dictionary(Of String, Dictionary(Of String, Object)) = 
    objInput _ 
     .SelectMany(Function(oKvp) oKvp.Value.Select(Function(iKvp) New With { _ 
      .OuterKey = oKvp.Key, _ 
      .InnerKey = iKvp.Key, _ 
      .Value = iKvp.Value})) _ 
     .GroupBy(Function(tri) tri.InnerKey) _ 
     .ToDictionary(_ 
      Function(g) g.Key, _ 
      Function(g) g.ToDictionary(_ 
       Function(tri) tri.OuterKey, _ 
       Function(tri) tri.Value)) 

基本上,你壓扁你的整個嵌套dinctionary爲對象的與兩個鍵和值的序列,然後由內鍵組他們,然後再轉換回巢字典。