Hallo,
Bin gerade dabei, folgendes Beispiel nachzuvollziehen (gekürzt und abgeändert, Original C#-Code unter <http://www.blackwasp.co.uk/LinqGrouping.aspx>)
Friend Class Program
Shared Sub Main(ByVal args() As String)
SimpleGroupingSDO()
SimpleGroupingQS()
Console.ReadLine()
End Sub
Private Shared Sub SimpleGroupingSDO()
'Original:
'private static void SimpleGroupingSDO()
'{
' Console.WriteLine("Simple Grouping (Standard Query Operator)");
' var stock = GetStock();
' var groups = stock.GroupBy(s => s.Category);
' OutputResults(groups);
'}
'Erweiterungsmethoden-Syntax:
Dim stock = GetStock()
Dim groups As IEnumerable(Of IGrouping(Of String, StockItem)) = _
stock.GroupBy(Function(s) s.Category)
OutputResults(Of String, StockItem)(groups)
End Sub
Private Shared Sub SimpleGroupingQS()
'Original:
'private static void SimpleGroupingQS()
'{
' Console.WriteLine("Simple Grouping (Query Syntax)");
' var stock = GetStock();
' var groups =
' from s in stock
' group s by s.Category;
' OutputResults(groups);
'}
Dim stock = GetStock()
Dim groups = _
From s In stock Group By s.Category Into Group
OutputResults(Of String, StockItem)(groups) 'Kompiliert nicht
End Sub
Private Shared Function GetStock() As List(Of StockItem)
Return New List(Of StockItem) From { _
New StockItem("Apple", "Fruit", 0.3), _
New StockItem("Banana", "Fruit", 0.35), _
New StockItem("Orange", "Fruit", 0.29), _
New StockItem("Cabbage", "Vegetable", 0.49), _
New StockItem("Carrot", "Vegetable", 0.29), _
New StockItem("Lettuce", "Vegetable", 0.3), _
New StockItem("Milk", "Dairy", 1.12) _
}
End Function
Private Shared Sub OutputResults(Of TKey, TResults)( _
ByVal groups As IEnumerable(Of IGrouping(Of TKey, TResults)))
For Each group In groups
Console.WriteLine(group.Key)
For Each product In group
Console.WriteLine(" {0}", product)
Next product
Next group
Console.WriteLine()
End Sub
End Class
Public Class StockItem
Public Property Name() As String
Public Property Category() As String
Public Property Price() As Double
Public Sub New( _
ByVal name As String, ByVal category As String, ByVal price As Double)
Me.Name = name
Me.Category = category
Me.Price = price
End Sub
Public Overrides Function ToString() As String
Return String.Format("{0}/{1}/{2}", Name, Category, Price)
End Function
End Class
Meine Fragen:
Ist es zutreffend, dass in der Abfrage-Syntax in VB beim Gruppieren nur die Variante ‚Group…By…Into’ zulässig ist? Zumindest verlangt der Compiler ein nachgestelltes ‚Into Group’.
Wenn ich explizit deklarieren möchte, wie müsste dann die korrekte Version lauten? Nach der Dokumentation müsste das ja eine Aufzählung von gruppierten Items sein.
Dim groups
As IEnumerable(Of IGrouping(Of
String, StockItem)) funktioniert zwar in der Extension-Syntax, ergibt in der Abfragesyntax aber einen Laufzeitfehler. Zudem meckert der Compiler bei ‚OutputResults(groups)’
Wenn ich den Compiler den Typ „groups“ ermitteln lasse und diesen dann via GetType auslese, erhalte ich folgende Angaben: „System.Linq.GroupedEnumerable`4[Data1.StockItem,System.String,Data1.StockItem,
VB$AnonymousType_1`2[System.String,System.Collections.Generic.IEnumerable`1[Data1.StockItem]]] “
Wie ließe sich daraus der gesuchte Typ bestimmen?
Sorry für die geballten Fragen. Für Hilfe trotzdem sehr dankbar!
Grüße
Jo