如何使用Linq ToDictionary返回字典项中具有多个值的字典?

时间:2010-01-25 19:15:59

标签: vb.net linq delegates todictionary

我想从标题下的linq查询中对项目进行分组,这样对于每个标题,我都有一个与标题标题匹配的对象列表。我假设解决方案是使用ToDictionary来转换对象,但是每个“group”(或字典键)只允许一个对象。我假设我可以创建类型字典(String,List Of()),但我无法弄清楚如何编写它。

作为一个例子,我在下面写了一个简化版本。

Public Class order
    Public ID As Integer
    Public Name As String
    Public DateStamp As Date
End Class
Public Function GetOrdersSortedByDate() As Generic.Dictionary(Of String, Generic.List(Of User))
    Dim orders As New List(Of order)(New order() _
    {New order With _
     {.ID = 1, .Name = "Marble", .DateStamp = New Date(2010, 1, 1)}, _
     New order With _
     {.ID = 2, .Name = "Marble", .DateStamp = New Date(2010, 5, 1)}, _
     New order With _
     {.ID = 3, .Name = "Glass", .DateStamp = New Date(2010, 1, 1)}, _
     New order With _
     {.ID = 4, .Name = "Granite", .DateStamp = New Date(2010, 1, 1)}})

    ' Create a Dictionary that contains Package values, 
    ' using TrackingNumber as the key.
    Dim dict As Dictionary(Of String, List(Of order)) = _
        orders.ToDictionary(Of String, List(Of order))(Function(mykey) mykey.Name, AddressOf ConvertOrderToArray) ' Error on this line

    Return dict
End Function
Public Function ConvertOrderToArray(ByVal myVal As order, ByVal myList As Generic.List(Of order)) As Generic.List(Of order)
    If myList Is Nothing Then myList = New Generic.List(Of order)
    myList.Add(myVal)
    Return myList
End Function

错误如下

'Public Function ConvertOrderToArray(myVal As order, myList As System.Collections.Generic.List(Of order)) As System.Collections.Generic.List(Of order)'
does not have a signature compatible with delegate 
'Delegate Function Func(Of order, System.Collections.Generic.List(Of order))(arg As order) As System.Collections.Generic.List(Of order)'.

如何输出每个字典项的列表?

2 个答案:

答案 0 :(得分:13)

您可以先按名称对所有结果进行分组,然后使用组密钥作为键调用字典

我不知道如何在VBA中编码它,但它在C#中会是什么样子

 Dictionary<string,List<Order>> dict = orders
  .GroupBy(x => x.Name)
  .ToDictionary(gr => gr.Key,gr=>gr.ToList() );

答案 1 :(得分:4)

而不是ToDictionary,您需要ToLookup。查找将存储每个键的值列表,因此不再需要键是唯一的。从这个方法返回的查找是不可变的。