2010-01-25 36 views
6

Tôi muốn nhóm các mục từ truy vấn LINQ bên dưới tiêu đề, do đó đối với mỗi tiêu đề tôi có danh sách các đối tượng khớp với tiêu đề tiêu đề. Tôi cho rằng giải pháp sẽ là sử dụng ToDictionary để chuyển đổi các đối tượng, nhưng điều này chỉ cho phép một đối tượng cho mỗi "nhóm" (hoặc khóa từ điển). Tôi cho rằng tôi có thể tạo từ điển kiểu (String, List Of()), nhưng tôi không thể tìm ra cách viết nó.Làm cách nào để sử dụng LINQ ToDictionary để trả về một từ điển có nhiều giá trị trong các mục từ điển?

Ví dụ tôi đã viết một phiên bản đơn giản dưới đây.

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 

Các lỗi như sau

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

Tôi phải làm gì để ra một danh sách cho mỗi mục từ điển?

Trả lời

13

bạn có thể nhóm đầu tiên tất cả các kết quả của bạn bằng tên và sau đó gọi tới dictionnary với phím nhóm như chìa khóa

tôi không biết làm thế nào để mã nó trong VB nhưng những gì nó sẽ trông giống như trong C#

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

Dim f = d.GroupBy (Hàm (x) x.PoolName) .ToDictionary (Hàm (t) t.Key, Hàm (g) g.ToList()) - Tôi sẽ cho nó đi! – digiguru

+0

Điều này làm việc như một giấc mơ, cảm ơn – digiguru

4

Thay vì ToDictionary, bạn muốn ToLookup. Một tra cứu sẽ lưu trữ một danh sách các giá trị cho mỗi khóa, do đó, khóa không còn cần thiết để là duy nhất. Việc tra cứu được trả về từ phương thức này là bất biến.

+0

Ý tưởng là có nhiều mục cho mỗi khóa, do đó, ý định là để có nó như là duy nhất. Tra cứu có thể đếm được không? – digiguru

+0

Có, nó được liệt kê theo các nhóm được đề cập trong tài liệu: http://msdn.microsoft.com/en-us/library/bb460184.aspx Nó thực hiện chính xác giải pháp được chấp nhận, nhưng là một hàm được xây dựng sẵn: orders.ToLookup (x => x.Name, x => x); –

Các vấn đề liên quan