1

正確な用語はわかりませんでしたが、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 ステートメントを作成しない限り、どこにも到達できませんでした。

4

1 に答える 1

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))

基本的に、ネストされたディクショナリ全体をキーと値の両方を持つオブジェクトのシーケンスにフラット化し、それらを内部キーでグループ化してから、ネストされたディクショナリに変換し直します。

于 2012-07-18T14:54:39.757 に答える