Drei gleiche Zahlen in einer List of integer erkennen

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Drei gleiche Zahlen in einer List of integer erkennen

    hallo, ich habe eine List of integer namens Zl03.
    Diese beinhaltet immer mal wieder Zahlen von 1-6 in unterschiedlicher Menge.
    Habe eine Boolean-Funktion gebastelt, die dies erkennt. Also wenn eine Zahl >=3 mal vorkommt = true, sonst = false.


    Kann man dies Eventuell, weniger umständlich lösen?
    Vielen Dank

    VB.NET-Quellcode

    1. Public einserdreierparsch As Integer = 0
    2. Public zweierdreierparsch As Integer = 0
    3. Public dreierdreierparsch As Integer = 0
    4. Public viererdreierparsch As Integer = 0
    5. Public fünferdreierparsch As Integer = 0
    6. Public sechserdreierparsch As Integer = 0
    7. Public Function Dreifachezahlenerkennen() As Boolean
    8. einserdreierparsch = 0
    9. zweierdreierparsch = 0
    10. dreierdreierparsch = 0
    11. viererdreierparsch = 0
    12. fünferdreierparsch = 0
    13. sechserdreierparsch = 0
    14. For Each element As Integer In ZL03
    15. If element = 1 Then
    16. einserdreierparsch += 1
    17. ElseIf element = 2 Then
    18. zweierdreierparsch += 1
    19. ElseIf element = 3 Then
    20. dreierdreierparsch += 1
    21. ElseIf element = 4 Then
    22. viererdreierparsch += 1
    23. ElseIf element = 5 Then
    24. fünferdreierparsch += 1
    25. ElseIf element = 6 Then
    26. sechserdreierparsch += 1
    27. End If
    28. Next
    29. If einserdreierparsch >= 3 Or zweierdreierparsch >= 3 Or dreierdreierparsch >= 3 Or viererdreierparsch >= 3 Or fünferdreierparsch >= 3 Or sechserdreierparsch >= 3 Then
    30. Return True
    31. End If
    32. Return False
    33. End Function
    zunächstmal solltest du lernen, Funktionen mit Argumenten zu schreiben.
    Also gib eine List(Of Integer) hinein, und die Function returnt True oder False.
    Wenn du das geschafft hast, liefere ich dir einen Einzeiler.

    Achso - sorry. Wie's aussieht (dein CodeSnippet) willst du etwas ganz anneres als was du sagst, was du willst.
    Dassis natürlich immer bisserl schwierig...
    @ErfinderDesRades

    Ich denke du meist das gleiche was ich jetzt auch denke.

    ich bin so frei und gib einfach mal den Link dazu.
    docs.microsoft.com/en-us/dotne…m.linq.enumerable.groupby

    Und hier noch ein Beispiel von mir wie man es quasi lösen kann
    doppelt vorkommende Zahlen in einer list of Integer herausarbeiten

    Freundliche Grüsse

    exc-jdbi
    @ErfinderDesRades ja also ich habe vergessen zu sagen, dass das ganze in einer boolean function ausgegeben werden soll

    @exc-jdbi dank des anderen forum beitrages lässt sich das ganze auch so lösen:

    VB.NET-Quellcode

    1. Public Function dreifachezahlenerkennen02() As Boolean
    2. Dim OrderedList = ZL03.OrderBy(Function(x) x)
    3. Dim ZahlenDieMindestensDreimalVorkommen = ZL03.Where(Function(x) OrderedList.Count(Function(y) x = y) > 2).Distinct
    4. If ZahlenDieMindestensDreimalVorkommen.Count > 0 Then
    5. Return True
    6. End If
    7. Return False
    8. End Function


    Über den Weg mit groupby habe ich eine function gefunden, die so aussieht, aber da bin ich mir unsicher, ob sie richtig ist und werde nicht wirklich schlau draus:

    VB.NET-Quellcode

    1. Dim a = ZL03.GroupBy(Function(x) 1).Select(Function(g) New With {Key .count = g.Count()})

    Visual_Prog schrieb:

    aber da bin ich mir unsicher,
    Dann betreibe mal Experimentelle Programmierung.
    Mach Dir ein separates Projekt und teste alle möglichen Fälle und sieh nach, was da passiert.
    Und:

    VB.NET-Quellcode

    1. Return ZahlenDieMindestensDreimalVorkommen.Count > 0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Visual_Prog
    Am Besten nicht komplizierter machen, als es schon von vornherein ist.

    Irgendwie so sollte es gehen. Man könnte es auch als 1 Zeiler wie EDR geschrieben hat machen.

    VB.NET-Quellcode

    1. Function CheckZL03(ZL03 As List(Of Int32))as Boolean
    2. Dim grouplist = ZL03.GroupBy(Function(x) x).
    3. Where(Function(y) y.Count >= 3).
    4. ToList
    5. If grouplist.Count >0 Then Return True 'If grouplist.Count = 6 Then Return True
    6. Return False
    7. End Function


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    exc-jdbi schrieb:

    VB.NET-Quellcode

    1. If grouplist.Count >0 Then Return True 'If grouplist.Count = 6 Then Return True
    2. Return False
    Eben im Post über Dir nicht gelesen?

    VB.NET-Quellcode

    1. Return grouplist.Count > 0
    2. 'Return grouplist.Count = 6
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja hab ich jetzt gelesen.

    Ich geb dir ja recht. Es war nicht ganz klar was mit den OR-Verknüpfungen in #1 Zeile 38 nur wirklich gemeint ist. Oder sollten es doch OrElse sein. Sowas kann schon sehr irritieren, weil das wären dann zwei Interpretationen mit deutlich unterschiedlichen Angehens weisen.

    Ich geh davon aus das es jetzt klar ist, und das es nächste mal vorher mehr "getestet" wird. Hoffentlich.

    Freundliche Grüsse

    exc-jdbi