2012-07-18 2 views
1

정확한 용어는 확실하지 않지만 LINQ를 사용하여 시도한 것은 하위 키가있는 사전의 키를 "전환"하는 것입니다 . LINQ를 사용하여 2 차원 사전의 하위 키로 부모 키 전환

내가 입력으로 가지고 모음입니다 :

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 

을 그리고 이것은 내가 출력으로 원하는 모음입니다 : 이미 VB.net에서 코드를 생성 한

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 

:

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를 평평하게 한 다음 중첩 된 사전으로 다시 변환합니다.

관련 문제