C#: Wie kann ich Arrays vergleichen?
Hallo,
ich bin sehr neu im Programmieren, habe hier eine Lotterie nachgecodet:
using System
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Random Zufallszahl = new Random();
int lösung1 = Convert.ToInt32(Zufallszahl.Next(1, 49));
int lösung2 = Convert.ToInt32(Zufallszahl.Next(1, 49));
int lösung3 = Convert.ToInt32(Zufallszahl.Next(1, 49));
int[] lösung = new int[3] { lösung1, lösung2, lösung3 };
Array.Sort(lösung);
int zahl1;
int zahl2;
int zahl3;
Console.WriteLine("Wilkommen in der Lotterie");
Console.Write("Geben sie ihre erste Zahl eine, diese muss zwischen 1 und 49 liegen: ");
zahl1 = Convert.ToInt32(Console.ReadLine());
if (zahl1 <= 49 && zahl1 >= 1)
{
Console.Write("Geben sie ihre zweite Zahl ein, diese muss zwischen 1 und 49 liegen: ");
zahl2 = Convert.ToInt32(Console.ReadLine());
if (zahl1 <= 49 && zahl1 >= 1)
{
Console.Write("Geben sie ihre dritte Zahl ein, diese muss zwischen 1 und 49 liegen: ");
zahl3 = Convert.ToInt32(Console.ReadLine());
if (zahl1 <= 49 && zahl1 >= 1)
{
int[] number = new int[3] { zahl1, zahl2, zahl3 };
Array.Sort(lösung);
bool isEqual = Enumerable.SequenceEqual(lösung, number);
}
}
else
{
Console.WriteLine("Die Zahl muss zwischen 1 und 49 liegen!");
return;
}
}
}
}
}
und habe eine Frage.
Dort wo
bool isEqual = Enumerable.SequenceEqual(lösung, number);
steht, probiere ich die Listen "lösung" und "number" miteinander zu vergleichen und falls sie gleich sind, einen Text anzeigen zu lassen. Doch vor diesen Befehl kann ich leider kein if setzen.
LG
2 Antworten
Dein Code hat mehrere Probleme.
- 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
- Du prüfst nicht, ob mehrmals die gleiche Zahl gezogen wurde. Du prüfst auch nicht, ob mehrmals die gleiche Zahl eingegeben wurde
- 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
- Dein Programm wird direkt beendet, wenn eine falsche Zahl eingegeben wurde
- 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