2010-01-25 16 views
6

Chcę grupować elementy z zapytania linq pod nagłówkiem, tak aby dla każdego nagłówka miałem listę obiektów, które pasują do tytułu nagłówka. Zakładałem, że rozwiązaniem będzie użycie ToDictionary do konwersji obiektów, ale to pozwala tylko na jeden obiekt na "grupę" (lub klucz słownikowy). Zakładałem, że mogę utworzyć słownik typu (String, List Of()), ale nie mogę wymyślić, jak to napisać.Jak używać Linq ToDictionary do zwracania słownika z wieloma wartościami w elementach słownika?

Jako przykład poniżej napisałem uproszczoną wersję.

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 

Błąd jest następujący

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

co mam zrobić do wyprowadzenia listy dla każdej pozycji słowniku?

Odpowiedz

13

mogłeś pierwsza grupa cały Twój wynik wg nazwy, a następnie zadzwonić do dictionnary z kluczem grupa jako kluczowy

nie wiem jak kod go w VB, ale co to będzie wyglądać w C#

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

Dim f = d.GroupBy (Funkcja (x) x.PlacName) .ToDictionary (funkcja (t) t.Key, funkcja (g) g.ToList()) - Odpalę! – digiguru

+0

To zadziałało jak marzenie, dzięki – digiguru

4

Zamiast ToDictionary potrzebujesz ToLookup. Wyszukiwanie będzie zawierało listę wartości dla każdego klucza, więc klucz nie musi już być unikalny. Wyszukiwanie zwrócone z tej metody jest jednak niezmienne.

+0

Chodzi o to, aby mieć wiele elementów dla każdego klucza, więc intencją jest, aby był unikalny. Czy wyszukiwanie jest możliwe? – digiguru

+0

Tak, jest to wyliczenie dla grup wymienionych w dokumentacji: http://msdn.microsoft.com/en-us/library/bb460184.aspx Robi dokładnie to, co ma przyjęte rozwiązanie, ale jest wbudowaną funkcją: orders.ToLookup (x => x.Nazwa, x => x); –

Powiązane problemy