Verkürzung der Schreibweise möglich ?

  • VB.NET
  • .NET 5–6

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

    Verkürzung der Schreibweise möglich ?

    Hallo Ihr Lieben,

    ich wollte mal fragen ob man folgenden Code noch stärker verkürzen könnte, ich bin mir nicht sicher ob hier z.B. Linq eine Möglichkeit wäre, wenn ja ist mir noch nciht in den Sinn gekommen, wie ich das schreiben könnte/müsste

    VB.NET-Quellcode

    1. 'es sollen "X" Integer mit einem Mindestwert und einem Maxwert in eine Liste gepackt werden, dabei soll es keine doppelten geben
    2. Private Function GenRanIntegers(ByVal Count As Integer, ByVal Min As Integer, ByVal Max As Integer) As List(Of Integer)
    3. Dim tmprnd As New Random()
    4. Dim tmplist As New List(Of Integer)
    5. Do Until tmplist.Count = Count
    6. Dim tmpnumber As Integer = tmprnd.Next(Min, Max + 1)
    7. If Not tmplist.Contains(tmpnumber) Then tmplist.Add(tmpnumber)
    8. Loop
    9. Return tmplist
    10. End Function



    LG und Danke
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    mit linq seh ich nix, aber guck dir mal die Hashset-Klasse an - die ist dafür designed, Dubletten festzustellen, abzuweisen etc.

    VB.NET-Quellcode

    1. 'es sollen "X" Integer mit einem Mindestwert und einem Maxwert in eine Liste gepackt werden, dabei soll es keine doppelten geben
    2. Private Function GenRanIntegers(Count As Integer, Min As Integer, Max As Integer) As List(Of Integer)
    3. Dim rnd As New Random()
    4. Dim results As New HashSet(Of Integer)
    5. Do Until results.Count = Count
    6. results.Add(rnd.Next(Min, Max + 1))
    7. Loop
    8. Return results.ToList
    9. End Function

    Das wird aber eine Endlosschleife bei zB Count =10, min=1, max=9
    @ErfinderDesRades Cool, das spart schon mal eine Zeile und das mit den Hashsets kannte ich auch noch nicht, habs bisher meist wie oben angegeben gelöst, Danke dir

    ​Das wird aber eine Endlosschleife bei zB Count =10, min=1, max=9

    Wäre in dem aktuellen Einsatzgebiet, nur für Lottozahlen gedacht, und der Count ist nicht zur Laufzeit veränderbar, sondern im Code fest hinterlegt.
    Sollte ich das mal an anderer Stelle mit Usereingabe nutzen, würde ich dem mit einer entsprechenden Abfrage vorbeugen.

    LG
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    He, wie findste den?

    VB.NET-Quellcode

    1. Private Function GenRanIntegers(Count As Integer, Min As Integer, Max As Integer) As List(Of Integer)
    2. Dim rnd As New Random()
    3. Return Enumerable.Range(0, Count * 10).Select(Function(x) rnd.Next(Min, Max + 1)).Distinct.Take(Count).ToList
    4. End Function
    bisserl abwegig, aber Linq muss ja ;)
    Wow, ich bin Baff, das ist ja quasi ein OneLiner geworden. Ich hoffe ich trete dir mit einigen Rückfragen nciht auf den Schlips:

    Warum wird Count hier *10 gerechnet
    Welcher Part in dieser Zeile sorgt für das Ausfiltern der Dubletten?

    Sorry für die Nachfrage, aber ich will nicht wie früher so oft den Fehler machen und solches CodeGold einfach benutzen, ohne es zu verstehen.

    Danke dir
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    VB.NET-Quellcode

    1. Dim tmprnd As New Random()
    Pack mal diese Zeile aus der Prozedur in die Klasse, sonst sind die Zahlen zwischen den Aufrufen nicht unbedingt zufällig zueinander.
    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!
    z.B. Count = 5

    VB.NET-Quellcode

    1. Enumerable.Range(0, Count * 10).Select(Function(x) rnd.Next(Min, Max + 1)).Distinct.Take(Count).ToList

    Enumerable.Range(0, Count * 10): nimm die Zahlen 0 bis 50
    .Select(Function(x) rnd.Next(Min, Max + 1)): merk Dir statt jener 50 Zahlen je eine Zufallszahl, die zwischen min und max liegt -> 50 Zufallszahlen entstehen
    .Distinct: entferne alle Dubletten
    .Take(Count): nimm von den übrig gebliebenen 5 her, falls noch soviele vorhanden; wenn nicht, dann nimm, was noch übrig ist
    .ToList: Mach aus diesen 50 Zufallszahlen eine Liste
    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.
    Jo, stimmt. Hatte ich falsch geschrieben. Sind ja max. noch Count Einträge übrig.
    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.
    @VaporiZed vielen lieben Dank für diese detaillierte Aufklärung, das bringt Licht ins Dunkel. Genial
    @RodFromGermany danke dir, mach ich
    @ErfinderDesRades danke dir nochmals für diese Lösung!
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Wenn die Spannbreite von min und max nicht all zu gross ist, würde auch so was gehen. (mit Fisher–Yates Shuffle)

    Wie könnte ich diesen Code anders schreiben? - Lotto Programm
    en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

    Freundliche Grüsse

    exc-jdbi

    C#-Quellcode

    1. var min = 5;
    2. var max = 48;
    3. var count = 12;
    4. if (count <= max + 1 - min)
    5. {
    6. var lottozahlen = ToRngNumbers(count, min, max);
    7. //Weiterer Code
    8. }


    C#-Quellcode

    1. private static Random rand = new Random();
    2. private static int[] ToRngNumbers(int cnt, int _min, int _max)
    3. =>Enumerable.Range(_min, _max +1 - _min).OrderBy(x => rand.Next()).Take(cnt).ToArray();

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