none
Enumerable Group - Erweiterungs- und Abfragesyntax RRS feed

  • Frage

  • 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

     

    Donnerstag, 19. Juni 2014 06:42