LINQ - GroupBy mit zwei Keys

  • C#

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    LINQ - GroupBy mit zwei Keys

    Hallo zusammen.

    Ich hätte auch mal wieder ne Frage.
    Ich möchte die Elemente einer Auflistung gruppieren, aber nach zwei Schlüsseln, also es sollen beide Schlüssel gleich sein, damit zwei Elemente in der gleichen Gruppe landen. Ich habs erst mal mit nem anonymen Typen so versucht:

    C#-Quellcode

    1. list.GroupBy(Item => new { Item.PropertyA, Item.PropertyB })
    Allerdings steht auf MSDN, dass anonyme Typen vom Compiler als Klassen übersetzt werden, und somit würde die Gleichheitsüberprüfung immer false ergeben, weswegen dann alle Elemente in ner unterschiedlichen Gruppe landen.
    Gibts irgend ne Möglichkeit, das zu bewerkstelligen, ohne mir ne extra Struktur dafür anzulegen? Ich will im Schlüssel beide Eigenschaften haben.
    Schonmal ausprobiert? Hätte es auch so gemacht, jetzt aber trotzdem nochmal nachgeschaut und müsste funktionieren: stackoverflow.com/questions/17…roup-by-expression-syntax


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @nafets3646
    Also das ist mal vereinfacht dargestellt die Situation:

    C#-Quellcode

    1. struct Item
    2. {
    3. char A { get; set; }
    4. int B { get; set; }
    5. double C { get; set; }
    6. }
    Ich hab eine Auflistung von Items. Wenn jetzt zwei Items für A und B den gleichen Wert haben, dann möchte ich sie in ein neues Item vereinen, wobei ich C zusammenzähle. Also in der Auflistung befinden sich z.B. ('A', 1, 0.5), ('A', 1, 1.25) und ('A', 1, 0.75), dann will ich daraus ein einziges Item mit den Werten ('A', 1, 2.5) machen. Ich habe mir überlegt, dass ich die Items erst nach A und B gruppieren muss, und dann kann ich per Sum die einzelnen Cs aus eine Gruppe zusammenzählne und daraus ein neues Item erstellen. Prinzip passt so? Oder geht das vielleicht auch noch einfacher?

    Edit:
    Die Abfrage ist auch eigentlich schon fertig, es geht mir nur darum, ob sie auch funktioniert.

    C#-Quellcode

    1. list.GroupBy(item => new { item.A, item.B }).Select(group => new Item(group.Key.A, group.Key.B, group.Sum(item => item.C)));

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    Also ich hab das jetzt einfach mal so versucht und bekommt die korrekten Werte soweit ich das sehe:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim lst As New List(Of Item)
    4. lst.Add(New Item("A"c, 1, 0.25))
    5. lst.Add(New Item("A"c, 1, 1.25))
    6. lst.Add(New Item("A"c, 1, 2.25))
    7. lst.Add(New Item("V"c, 1, 0.25))
    8. lst.Add(New Item("V"c, 1, 0.25))
    9. lst.Add(New Item("A"c, 1, 2.25))
    10. lst.Add(New Item("V"c, 1, 0.25))
    11. lst.Add(New Item("V"c, 1, 0.25))
    12. Dim query = From n In lst
    13. Group By n.A, n.B
    14. Into Sum(n.C)
    15. For Each Item In query
    16. Console.WriteLine(Item.A.ToString & " | " & Item.B.ToString & " | " & Item.Sum.ToString)
    17. Next
    18. Console.Read()
    19. End Sub
    20. End Module
    21. Structure Item
    22. Property A As Char
    23. Property B As Integer
    24. Property C As Double
    25. Sub New(a As Char, b As Integer, c As Double)
    26. Me.A = a
    27. Me.B = b
    28. Me.C = c
    29. End Sub
    30. End Structure


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Danke schonmal, aber du verwendest ja nicht die Extension-Schreibweise. Bist du sicher, dass Group By n.A, n.B äquivalent zu .GroupBy(Function(item) New With { n.A, n.B }) ist? Wenn nicht, ich hab euch kein Problem die LINQ-Schreibweise zu verwenden.
    Jo, wird schon passen, ich hab zumindest auch beim Suchen jetzt schon öfter sowas gesehen.
    Komisch finde ichs aber trotzdem, dann wird der Compiler da wohl einiges rumzaubern, weil nach meinem normalen Verständnis sollte es nicht funktionieren.
    Es gibt allgemein zwei Linq-Schreibweisen. Die eine über Schlüsselwörter und die andere über Extensions. Welche du nimmst ist dir überlassen. Rauskommen sollte das Selbe.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.