Find-Methode für Gruppierungen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Find-Methode für Gruppierungen

    Hallo,

    ich versuche eine Wochensumme zu basteln. Da ich in den Datensätzen die KW mit drin hab, ist das erstmal super simpel mittels Group By

    VB.NET-Quellcode

    1. Dim WochenSumme = From t In Basis Group t By t.KW Into Stk = Sum(t.Stk), Kosten = Sum(t.Kosten)


    Ich würde den Inhalt aber gerne einzeln abrufen, das läuft bei mir jetzt so erstmal

    VB.NET-Quellcode

    1. Dim bestimmteKW = 52
    2. Dim test = WochenSumme.Where(Function(x) x.KW = bestimmteKW)(0).Stk


    Dabei ist eine Gruppe ja direkt schon eindeutig, weswegen eine Find-Methode das natürlich viel besser könnte. Kann man das noch modifizieren?
    Pseudo:

    VB.NET-Quellcode

    1. Dim bestimmteKW = 52
    2. Dim test = WochenSumme.FindByKW(bestimmteKW).Stk


    Viele Grüße

    Edit: Ups, .First wäre wohl was ich suche. Tut mir Leid :S , die Frage hat sich erledigt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Wenn ganz sicher ist, dass die KW auffindbar ist, dann ja, First. Wenn nicht (Stichwort KW 53), dann FirstOrDefault und dann auf Nothing prüfen. Oder mit dem ?-Operator, auch wenn ich mit beiden etwas auf Kriegsfuß stehe und daher das Where bevorzuge und dann auf Anzahl teste, um von Nothing-Tests loszukommen.

    VB.NET-Quellcode

    1. Dim test1 = WochenSumme.FirstOrDefault(Function(x) x.KW = bestimmteKW)
    2. If test1 Is Nothing Then ThrowNew ArgumentException("Die gewünschte KW gibt es nicht.")
    3. Dim test2 = test1.Stk
    4. Dim test3 = WochenSumme.FirstOrDefault(Function(x) x.KW = bestimmteKW)?.Stk
    5. Dim test4 = WochenSumme.Where(Function(x) x.KW = bestimmteKW)
    6. If Not test4.Any Then ThrowNew ArgumentException("Die gewünschte KW gibt es nicht.")
    7. Dim test5 = test4.Stk

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hehe, hab mich um die KWs tatsächlich schon separat gekümmert.
    Irgendwie konnte ich die ohne eigene Funktion gar nicht richtig hinkriegen. Aber da kommt KW 53 so jetzt auch nur raus wenns die im Jahr auch gibt.

    VB.NET-Quellcode

    1. Private Function CalcKW(dat As DateTime) As Integer
    2. Dim KW = Kalender.GetWeekOfYear(dat, Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
    3. If KW = 53 AndAlso dat.Month = 12 Then
    4. Select Case dat.AddDays(4 - dat.Day).AddMonths(1 - dat.Month).AddYears(1).DayOfWeek
    5. Case DayOfWeek.Friday
    6. If dat.Day >= 31 Then KW = 1
    7. Case DayOfWeek.Saturday
    8. If dat.Day >= 30 Then KW = 1
    9. Case DayOfWeek.Sunday
    10. If dat.Day >= 29 Then KW = 1
    11. End Select
    12. End If
    13. Return KW
    14. End Function

    Meine Wenigkeit liiebt ja das Lookup und die ToLookup-Extension:

    VB.NET-Quellcode

    1. Dim WochenSummen = Basis.ToLookUp(Function(t) t.KW, Function(t) New With {Stk = Sum(t.Stk), Kosten = Sum(t.Kosten)})
    2. Dim bestimmteKW = 52
    3. Dim test = WochenSummen(bestimmteKW) 'einfach wie ein Dictionary, aber anders als bei dic ergibt ein Lookup Nothing statt einer KeyNotFoundException - also zB bei KW=55
    4. 'oder auch
    5. For Each test In WochenSummen
    6. ' nudelt alle vorhandenen KWs durch (kann ja auch eine KW ohne Verkäufe auftreten)
    7. Next
    Sollteste dir angugge.
    Code kann Fehlerhaft sein, kann mit deiner Basis ja nix testen.