Как использовать Linq ToDictionary для возврата словаря с несколькими значениями в элементах словаря? - PullRequest
6 голосов
/ 25 января 2010

Я хочу сгруппировать элементы из запроса linq под заголовком, чтобы для каждого заголовка у меня был список объектов, соответствующих заголовку заголовка. Я предполагал, что решение будет использовать ToDictionary для преобразования объектов, но это позволяет только один объект на «группу» (или ключ словаря). Я предполагал, что смогу создать словарь типа (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 ]

13 голосов
/ 26 января 2010

вы можете сначала сгруппировать все результаты по имени, а затем вызвать словарь с ключом группы в качестве ключа

я не знаю, как кодировать его в VB, но как это будет выглядеть в C #

 Dictionary<string,List<Order>> dict = orders
  .GroupBy(x => x.Name)
  .ToDictionary(gr => gr.Key,gr=>gr.ToList() );
4 голосов
/ 27 января 2010

Вместо ToDictionary вы хотите ToLookup . При поиске будет храниться список значений для каждого ключа, поэтому ключ больше не должен быть уникальным. Однако поиск, возвращаемый этим методом, является неизменным.

...