C#: Wie kann ich Arrays vergleichen?

2 Antworten

Dein Code hat mehrere Probleme.

  1. Du hast an einigen Stellen unnötig viel Schreibkram gemacht. Erst drei Variablen für die Zufallszahlen anlegen, dann ein unnötiger Convert von int zu int und dann erst die Zahlen in ein Array schreiben. Und unten auch drei if-Blöcke, die alle dasselbe machen
  2. Du prüfst nicht, ob mehrmals die gleiche Zahl gezogen wurde. Du prüfst auch nicht, ob mehrmals die gleiche Zahl eingegeben wurde
  3. Bei der Eingabe der Zahlen prüfst du zwar für jede, ob sie im Bereich zwischen 1 und 49 liegt, aber du gibst nur bei der zweiten Zahl eine Fehlermeldung aus, wenn sie falsch eingegeben wurde
  4. Dein Programm wird direkt beendet, wenn eine falsche Zahl eingegeben wurde
  5. So gesehen kein wirklicher Fehler, aber mit Enumerable.SequenceEqual(lösung, number); prüfst du, ob alle Zahlen in den beiden Sequenzen übereinstimmen. Bei Lotto will man in der Regel auch wissen, ob nur ein paar Zahlen übereinstimmen.

Zu deiner Frage: mit

bool isEqual = Enumerable.SequenceEqual(lösung, number);

weist du der Variablen isEqual das Ergebnis von SequenceEqual zu. Du kannst jetzt entweder isEqual in ein if schreiben:

if (isEqual) 
{
    ...
}

oder du kannst isEqual einfach weglassen:

if (Enumerable.SequenceEqual(lösung, number)) 
{
    ...
}

Schau dir mal meine Lösung an:

class Program
{
    private static Random random = new Random();
    public static void Main()
    {
        // Zahlen ziehen. Dabei aufpassen, dass keine Zahlen doppelt vorkommen
        int[] gezogeneZahlen = randomGenerator(1, 49) // Zufallszahlen generieren
                                .Distinct() // nur unterschiedliche Zahlen annehmen
                                .Take(3) // nach drei Zahlen aufhören
                                .OrderBy(zahl => zahl) // sortieren
                                .ToArray(); // in ein Array umwandeln


        Console.WriteLine("Wilkommen in der Lotterie");
        Console.Write("Geben Sie drei Zahlen ein, diese müssen zwischen 1 und 49 liegen: ");


        bool wrongInput = true;
        int[] getippteZahlen; // Variable für getippte Zahlen hier schon instanziieren,
                                // damit sie außerhalb des while-blocks sichtbar ist.


        do // so oft nach drei Zahlen fragen, bis der Benutzer eine gültige Eingabe macht.
        {
            getippteZahlen = Regex.Split(Console.ReadLine(), "[^0-9]+") // Nur Zahlen aus Eingabe holen
                                        .Select(str => int.Parse(str)) // Zahlenstrings in ints umwandeln
                                        .Where(zahl => zahl >= 1 && zahl <= 49) // nur Zahlen zwischen 1 und 49 zulassen
                                        .Distinct() // nur unterschiedliche Zahlen zulassen
                                        .OrderBy(zahl => zahl) // sortieren
                                        .ToArray(); // in ein Array umwandeln


            if (getippteZahlen.Length != 3) // wenn am nicht genau drei Zahlen übrig bleiben
            {
                Console.WriteLine("Sie müssen genau drei unterschiedliche Zahlen im Bereich von 1 bis 49 eingeben.");
                wrongInput = true;
            }
            else
            {
                wrongInput = false;
            }
        } while (wrongInput);


        // bestimmen, welche Zahlen übereinstimmen
        int[] gleicheZahlen = getippteZahlen.Intersect(gezogeneZahlen).ToArray();


        Console.WriteLine();
        Console.WriteLine($"Gezogene Zahlen: {String.Join(", ", gezogeneZahlen)}");
        Console.WriteLine($"Getippte Zahlen: {String.Join(", ", getippteZahlen)}");
        Console.WriteLine($"Übereinstimmende Zahlen: {String.Join(", ", gleicheZahlen)}");
        Console.WriteLine($"Anzahl übereinstimmende Zahlen: {gleicheZahlen.Length}");
    }
        
    // mit dieser Funktion wird ein unendliches Enumerable aus Zufallszahlen erzeugt.
    // Man muss also selbst irgendwann abbrechen (z.B. mit Take(anzahl))
    private static IEnumerable<int> randomGenerator(int min, int max)
    {
        while(true) yield return random.Next(min, max);
    }
}

Was ist jetzt das Problem?
Schreib danach ein if mit isEqual und gut is.

Abgesehen davon:
Fast alle Methoden in der Enumerable-Klasse (und Queryable auch) sind Erweiterungsmethoden, man kann den Aufruf also auch so schreiben:

var isEqual = lösung.SequenceEqual(number);

Deine Schreibweise ist aber nicht falsch (der Compiler macht auch nix anderes), es macht nur sonst niemand so :D