myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » dynamische If-Abfrage
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

dynamische If-Abfrage

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Xargus Xargus ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.05.2019
Beiträge: 4


Xargus ist offline

dynamische If-Abfrage

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Leute,

ich habe da mal ein kleines Problem. Kurz vorweg, ich habe den normalen Weg über 50 If-Anweisungen bereits programmiert.Nur dies ist einfach extrem unübersichtlich.

Nun mein übersichtlicherer Ansatz:(denn ich aber nicht zum laufen bringe)

ich habe ein Array mit 13 Einträgen:

C#-Code:
Z1[0] = 10;
Z1[1] = 11;
Z1[2] = 10;
Z1[3] = 12;
//usw.....

dieses Array wird dynamisch gefüllt.
aus diesen 12 Zahlen lassen sich sehr viel Kombinationen erstellen:
diese Kombinationen schreibe ich in ein anderes Array(hard)

C#-Code:
    K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
    K[2] = "Z1[0] == Z1[4] && Z1[0] == Z1[6]";
    K[3] = "Z1[0] == Z1[7] && Z1[0] == Z1[8]";
    .....
    K[50] = "Z1[0] == Z1[7] && Z1[0] == Z1[10] && Z1[0] == Z1[11] && Z1[0] == Z1[12]";
usw....

(hier hab ich ca. 50 Kombos
nun möchte ich Array K in einer Schleife durchgehen und zutreffende Kombinationen herausfinden

C#-Code:
int Treffer = 0;
    for (int i = 1; i <= 50; i++)
    {
      if ((K[i]) == true) <--hier liegt das Problem
      {
           Treffer = i;
      }
    }

Kann mir jemand sagen wie ich diese Abfrage dynamisch regeln kann?

Danke Xargus
22.05.2019 15:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Papst Papst ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.09.2014
Beiträge: 205
Entwicklungsumgebung: VS2017
Herkunft: Kassel


Papst ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Deine Bedingungen sind im zweiten Array (K) als strings hinterlegt. Damit es auf die weise funktioniert, müsstest du die Strings parsen und auswerten.

Was du machen könntest wäre ein Array (oder Dictionary?) aus delegates, die du mit Lambda Ausdrücken befüllst:

C#-Code:
List<Func<int, int, int bool>> K = new List<Func<int, int, int, bool>>();
K.Add(i1, i2, i3) => i1 == i2 && i1 == i3);

Infos zu Func<>:  https://docs.microsoft.com/de-de/dotnet/...etframework-4.8

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Papst am 22.05.2019 16:25.

22.05.2019 16:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.225
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Alternativ könntest du auch mit Predicate arbeiten.
Dies nutzt die List<T> z.B. auch zum suchen von Elementen bei den Find Methoden.
Dann müsstest du dir zwar auch 50 Einträge erstellen, aber dann könntest du schauen ob ein Eintrag einen Match mit einem Predicate hat.

Link:
 https://docs.microsoft.com/de-de/dotnet/...etframework-4.8

Ansonsten wäre aber die Frage ob es nicht anders lösbar wäre.
50 If Abfragen klingt nach einer sehr seltsamen Konstellation um die Treffer zu ermitteln.
Was mir nur auffällt ist auch, dass du in deinem Beispiel bei deinen 50 Abfragen immer den ersten Eintrag gegen die anderen Einträge in bestimmten Konstellationen prüft.
Richt etwas nach der Suche von Dubletten.
Und diese kann man auch ohne 50 Abfragen ermitteln.

Nachtrag:
Es wäre auch ggf. hilfreich etwas Background zu deinem Problem zu haben.
Was sind dies z.B. für Daten und woher kommen diese?
Warum gibt es scheinbar fixe Kombinationen etc.

T-Virus

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am 22.05.2019 22:08.

22.05.2019 22:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Stefan.Haegele Stefan.Haegele ist männlich
myCSharp.de-Mitglied

avatar-3068.jpg


Dabei seit: 13.03.2009
Beiträge: 317
Entwicklungsumgebung: Visual Studio 2010 Ultimat
Herkunft: Untermeitingen


Stefan.Haegele ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Xargus:
C#-Code:
int Treffer = 0;
    for (int i = 1; i <= 50; i++)
    {
      if ((K[i]) == true) <--hier liegt das Problem
      {
           Treffer = i;
      }
    }

Und noch als Tipp:  [Tipp] Anfängerhinweis == true / == false
23.05.2019 06:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Xargus Xargus ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.05.2019
Beiträge: 4

Themenstarter Thema begonnen von Xargus

Xargus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Guten Morgen,

danke erstmal für die Tipps. Ich werde sie heute Abend ausprobieren bzw. überdenken.

Zitat:
Nachtrag:
Es wäre auch ggf. hilfreich etwas Background zu deinem Problem zu haben.
Was sind dies z.B. für Daten und woher kommen diese?
Warum gibt es scheinbar fixe Kombinationen etc.

Ich versuche mich an einem kleinen Spiel.
ich habe ein Feld mit unterschiedlichen Steinen(Images) und ein dazu gehöriges Array in denen die Bildnummer gespeichert sind. Nun verschiebt(tauscht) der Spieler zwei Steine und ich muss die Kombinationen ermitteln und darauf reagieren.
Diese Kombinationen in "string[] K" werden von mir hard hinterlegt. Z1 dagegen reagiert auf den Stein den der Spieler anklickt bzw tauscht und wird mit dem Umfeld des Steines gegengeprüft.

---------------------------------------------
zu dem Tip mit dem "== True".

Zitat:
Und noch als Tipp: [Tipp] Anfängerhinweis == true / == false

ich habe es der Lesbarkeit halber so ausgeschrieben um das Problem besser zu vermitteln.
Ich wollte damit nur sagen:
Schleife lauf durch Array K durch und schau ob das was in K[Schleife] steht, zutrifft oder nicht.


Xargus
23.05.2019 08:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 426
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Xargus:
C#-Code:
    K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
    K[2] = "Z1[0] == Z1[4] && Z1[0] == Z1[6]";
    K[3] = "Z1[0] == Z1[7] && Z1[0] == Z1[8]";
    .....
    K[50] = "Z1[0] == Z1[7] && Z1[0] == Z1[10] && Z1[0] == Z1[11] && Z1[0] == Z1[12]";
usw....

ich sehe hier nur && Verknüpfungen, ist es so das nur diese vorkommen oder sollten auch bald andere Operatoren hinzugefügt werden?

Wenn es nur so einfache Operatoren wie && und == verwendet werden, könnte man solche string's in eine Klasse transferieren die wiederum eine Instanz von sich selbst besitzt.

Mit einer Methode kann dann der Vergleich ausgeführt werden. Diese Methode müßte dann rekursiv die eigenen Instanzen durchlaufen und am Ende das Ergebnis zurückliefern.

Somit hättest du eine typisierte 1 zu *n Beziehung und müßtest in der äußersten Schicht nur die eine Methode aufrufen, je Kombo.

Ein kurzes aus dem Kopf geschriebens Beispiel:

C#-Code:
internal class Combo
{
    public Combo()
    {
        this.Id = -1;
        this.Z1 = -1;
        this.Z2 = -1;
        this.SubCombo = null;
    }

    public int Id {get;set;}
    // Z1 & Z2 dienen nun nicht als Wertehalter sondern als Indexzugriffe (Index eines Arrays)
    public int Z1 {get;set;}
    public int Z2 {get;set;}
    public Combo SubCombo {get;set;}

    public bool IsMatch()
    {
        if(Z1 != Z2) return false;
        if(SubCombo == null) return true;
        return SubCombo.IsMatch();
    }
}

// In der Anwendung:
Z1[0] = 10;
Z1[1] = 11;
Z1[2] = 10;
Z1[3] = 12;
//usw.....

List<Combo> combos = new List<Combo>();
// K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
combos.add(new Combo()
{
    Id = 1, // K[1]
    Z1 = Z1[0],
    Z2 = Z1[1],
    Combo = new Combo()
    {
        // Id ist ab hier nicht mehr notwendig, nur in der äußersten Schicht
        Z1 = Z1[0],
        Z2 = Z1[2]
    }
});

int treffer = -1;
foreach(Combo c in Combos)
{
    if(c.IsMatch())
    {
        treffer = c.Id;
    }
}

Kann natürlich noch aufgehübscht werden... ;)

[Edit1]
Hier noch eine angepasste Variante, die wohl eher zum Ziel passt:

C#-Code:
internal class Combo
{
    public Combo()
    {
        this.Id = -1;
        this.Z1 = -1;
        this.Z2 = -1;
        this.SubCombo = null;
    }

    public int Id {get;set;}
    public int Z1 {get;set;}
    public int Z2 {get;set;}
    public Combo SubCombo {get;set;}

    public bool IsMatch(params int[] data)
    {
        if(data == null) return false;
        if(Z1 < 0 || Z1 > data.Lenght - 1 || Z2 < 0 || Z2 > data.Lenght - 1) return false;
        if(data[Z1] != data[Z2]) return false;
        if(SubCombo == null) return true;
        return SubCombo.IsMatch(data);
    }
}

// In der Anwendung:
int[] ZDATA = new int[13];
ZData[0] = 10;
ZData[1] = 11;
ZData[2] = 10;
ZData[3] = 12;
//usw.....

List<Combo> combos = new List<Combo>();
// Die Änderung sieht vor, daß hier nur noch die Komo-Vorlage mit Indexwerte definiert wird (solang es immer dieselben Array-Gößen sind bzw. genau darauf geachtet wird, das alles zusammenpasst...)
// K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
combos.add(new Combo()
{
    Id = 1, // K[1]
    Z1 = 0,
    Z2 = 1,
    Combo = new Combo()
    {
        // Id ist ab hier nicht mehr notwendig, nur in der äußersten Schicht
        Z1 = 0,
        Z2 = 2
    }
});

int treffer = -1;
foreach(Combo c in Combos)
{
    if(c.IsMatch(ZData))
    {
        treffer = c.Id;
    }
}

[/Edit1]

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ThomasE. am 24.05.2019 08:44.

23.05.2019 09:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.544
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Xargus,

im K-Array stehen nur boolsche Werte?
Dann nimm ein Bitfeld / Bitvektor und setzt entsprechend Index das jeweilige Bit. So kannst du einfach mit == 0 od. != 0 prüfen.

Siehe dazu auch  [Artikel] Bitoperationen in C#

mfG Gü
23.05.2019 09:55 Beiträge des Benutzers | zu Buddylist hinzufügen
Xargus Xargus ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.05.2019
Beiträge: 4

Themenstarter Thema begonnen von Xargus

Xargus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

danke an alle, die mir geholfen haben.

Ich bin das Problem, mit dem Vorschlag von ThomasE realisiert und es funktionierte.
Ich habe es so angepasst das ich weiterhin mein Array K benutzen kann um einfach die Übersicht über alle Kombos nicht zu verlieren. Und/Oder einfach neue hinten ranhängen kann.

Danke
Cu

C#-Code:
//Dreier
    K[1]  = "1|1|2";
    K[2]  = "2|4|6";
    K[3]  = "3|7|8";
    K[4]  = "4|10|12";
    K[5]  = "5|7|1";
    K[6]  = "6|4|10";
    //Vierer
    K[7]  = "7|1|2|7";
    K[8]  = "8|4|6|10";
    K[9]  = "9|7|8|1";
    K[10] = "10|10|12|4";
    //Vierer Würfel
    K[11] = "11|1|10|11";
    K[12] = "12|1|4|5";
    K[13] = "13|4|7|3";
    K[14] = "14|7|9|10";
    //Vierer Neuner
    K[15] = "15|2|6|14";
    K[16] = "16|6|8|15";
    K[17] = "17|8|12|16";
    K[18] = "18|2|12|13";
    //Fünfer
    K[19] = "19|1|2|7|8";
    K[20] = "20|4|6|10|12";
    //Knickfünfer
    K[21] = "21|1|2|4|6";
    K[22] = "22|4|6|7|8";
    K[23] = "23|7|8|10|12";
    K[24] = "24|10|12|1|2";
    //T-Fünfer
    K[25] = "25|1|2|4|10";
    K[26] = "26|1|4|6|7";
    K[27] = "27|4|7|8|10";
    K[28] = "28|1|7|10|12";
    //Würfel Fünfer
    K[29] = "29|1|10|11|2";
    K[30] = "30|1|10|11|12";
    K[31] = "31|1|4|5|2";
    K[32] = "32|1|4|5|6";
    K[33] = "33|4|7|3|6";
    K[34] = "34|4|7|3|8";
    K[35] = "35|7|9|10|8";
    K[36] = "36|7|9|10|12";


    string[] Z = new string[5];

    for (int i = 1; i <= 36; i++)
    {
      Z = K[i].Split('|');
      if (Z.Length == 3)
      {
        combos.Add(new Combo()
        {
          Id = Convert.ToInt16(Z[0]),
          Z1 = Convert.ToInt16(Z1[0]),
          Z2 = Convert.ToInt16(Z1[Convert.ToInt16(Z[1])]),
          SubCombo = new Combo() { Z1 = Convert.ToInt16(Z1[0]), Z2 =
          Convert.ToInt16(Z1[Convert.ToInt16(Z[2])]) }
        });
      }
      if (Z.Length == 4)
      {
        combos.Add(new Combo()
        {
          Id = Convert.ToInt16(Z[0]),
          Z1 = Convert.ToInt16(Z1[0]),
          Z2 = Convert.ToInt16(Z1[Convert.ToInt16(Z[1])]),
          SubCombo = new Combo()
          {
            Z1 = Convert.ToInt16(Z1[0]),
            Z2 = Convert.ToInt16(Z1[Convert.ToInt16(Z[2])]),
            SubCombo = new Combo() { Z1 = Convert.ToInt16(Z1[0]), Z2 =
            Convert.ToInt16(Z1[Convert.ToInt16(Z[3])]) }
          }
        });
      }
      if (Z.Length == 5)
      {
        combos.Add(new Combo()
        {
          Id = Convert.ToInt16(Z[0]),
          Z1 = Convert.ToInt16(Z1[0]),
          Z2 = Convert.ToInt16(Z1[Convert.ToInt16(Z[1])]),
          SubCombo = new Combo()
          {
            Z1 = Convert.ToInt16(Z1[0]),
            Z2 = Convert.ToInt16(Z1[Convert.ToInt16(Z[2])]),
            SubCombo = new Combo()
            {
              Z1 = Convert.ToInt16(Z1[0]),
              Z2 = Convert.ToInt16(Z1[Convert.ToInt16(Z[3])]),
              SubCombo = new Combo() { Z1 = Convert.ToInt16(Z1[0]), Z2 =
              Convert.ToInt16(Z1[Convert.ToInt16(Z[4])]) }
            }
          }
        });
      }
    }
27.05.2019 11:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.225
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es wäre sinnvoller aus K eine Liste zu machen.
Aktuell musst du für jeden Eintrag den Index manuell setzen.
Ebenfalls musst du bei neuen Kombinationen die Array Größe anpassen.
Dies würde die Liste für dich übernehmen.
Hier müsstest du nur per Add die Kombinationen hinzufügen.

Ebenfalls entspricht der erste Part immer der ID.
Dieser kann entfallen, da du beim befüllen der combos Liste mit combos.Count + 1 die ID hochzählen lassen kannst.
Spart dir immer wieder manuelles setzen der ID.

Es wäre auch sinnvoller, wenn die die Ebenen nicht über die Länge des Array Eintrags ermittelst, sondern ein eigenes Trennzeichen für die Ebenen machst.
Dies macht die Auswertung dann auch etwas einfacher und offensichtlicher.

T-Virus
27.05.2019 11:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.255
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Noch besser und einfacher aus K einen readonly-Member zu machen und direkt zu initialisieren:

C#-Code:
private readonly List<string> Combinations = new List<string>()
    {
        "1|1|2", "2|4|6", ...
    }

Persönlich würde ich daraus sogar eine List<List<int>> erzeugen, um die String->Int Konvertierungen zu eliminieren.
Selbst wenn die Daten aus einer Textdatei kämen, sollte das Parsen nur einmalig beim Einlesen geschehen.

Und weitere Codeoptimierungen wären auch angebracht (wie z.B. die unnötige Initialisierung string[] Z = new string[5] vor der Schleife).
27.05.2019 12:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Xargus Xargus ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.05.2019
Beiträge: 4

Themenstarter Thema begonnen von Xargus

Xargus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

T-Virus wie meinst du das?

Zitat:
Es wäre auch sinnvoller, wenn die die Ebenen nicht über die Länge des Array Eintrags ermittelst, sondern ein eigenes Trennzeichen für die Ebenen machst.
Dies macht die Auswertung dann auch etwas einfacher und offensichtlicher.

wenn ich aus K eine Liste mache funktioniert Split nicht mehr. Wie könnte ich das denn dann machen bzw. umgehen?

oder bzw.

Zitat:
private readonly List<string> Combinations = new List<string>()
{
"1|1|2", "2|4|6", ...
}

Wie lese ich dort Zeile für Zeile aus?
Gruss Xargus
27.05.2019 19:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.255
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie bei einem Array auch mittels for oder foreach, s. Beispiel bei  List<T> oder  How to use C# List Class ("Retrieve List elements").

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am 28.05.2019 08:11.

28.05.2019 08:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 426
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

also mein Beispiel war ja nur ein Anhaltspunkt. Könnte man noch um einiges Erweitern, genauso wie das automatische Befüllen solcher Informationen, allerdings muß man sich halt für eine Vorgehensweise entscheiden.

Hier mal das vorherige Beispiel mit den index-Werten mit der einfließenden Idee von @Th69:

C#-Code:
internal class Combo
{
    public Combo()
    {
        this.Id = -1;
        this.Z1 = -1;
        this.Z2 = -1;
        this.SubCombo = null;
    }

    public int Id {get;set;}
    public int Z1 {get;set;}
    public int Z2 {get;set;}
    public Combo SubCombo {get;set;}

    public bool Init(int id, List<int> indexes)
    {
        if(indexes == null) return false;
        if(indexes.Count == 0) return false;
        // Prüft ob die Anzahl immer eine Gerade ist:
        if(indexes.Count % 2 == 1) return false;
        Id = id;
        // EDIT1: new List<int>(…)
        // Sonst wird die Liste die von außen kommt verändert (Einträge entfernt), wäre in dem Fall eigentlich nicht richtig
        OnInit(new List<int>(indexes));
        return true;
    }

    private void OnInit(List<int> indexes)
    {
        Z1 = indexes[0];
        indexes.Remove(0);
        Z2 = indexes[0];
        indexes.Remove(0);
        if(indexes.Count == 0) return;
        SubCombo = new Combo();
        SubCombo.OnInit(indexes);
    }

    public bool IsMatch(params int[] data)
    {
        if(data == null) return false;
        if(Z1 < 0 || Z1 > data.Lenght - 1 || Z2 < 0 || Z2 > data.Lenght - 1) return false;
        if(data[Z1] != data[Z2]) return false;
        if(SubCombo == null) return true;
        return SubCombo.IsMatch(data);
    }
}

// In der Anwendung:
int[] ZDATA = new int[13];
ZData[0] = 10;
ZData[1] = 11;
ZData[2] = 10;
ZData[3] = 12;
//usw.....

List<Combo> combos = new List<Combo>();
List<List<int>> simpleRawTemplates = new List<List<int>>();
// K[1] = "Z1[0] == Z1[1] && Z1[0] == Z1[2]";
simpleRawTemplates.Add(new List<int>(new int[]{0, 1, 0, 2}));

for(int id = 0; id < indexes.Count; id++)
{
    Combo c = new Combo();
    c.Init(id, indexes[id]);
    combos.Add(c);
}

int treffer = -1;
foreach(Combo c in Combos)
{
    if(c.IsMatch(ZData))
    {
        treffer = c.Id;
    }
}

Nur nützt das alles nix wenn man es nicht versteht was da passiert. Beim Debuggen kann man jedoch alles nachvollziehen und dabei leichter dazu lernen. Ist auch eher eine Ausnahme das ich soviel vorarbeite ;)

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ThomasE. am 28.05.2019 09:15.

28.05.2019 08:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
CoLo
myCSharp.de-Mitglied

Dabei seit: 25.09.2009
Beiträge: 222


CoLo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Mein erster Gedanke war:

C#-Code:
    public partial class Form1 : Form
    {
        //Dem Form1 noch folgendes hinzufügen:
        //
        // * TextBox mit Namen textBoxEingabe
        // * TextBox mit Namen textBoxAusgabe
        // * Ereignis Form1_Load
        // * Ereignis textBox1_TextChanged

        public Form1()
        {
            InitializeComponent();
        }

        List<Kombi> _kombis;
        private void Form1_Load(object sender, EventArgs e)
        {
            _kombis = new List<Kombi>();

            _kombis.Add(Kombi.GetKombi("Dreier", "1|1|2"));
            _kombis.Add(Kombi.GetKombi("Dreier", "2|4|6"));
            _kombis.Add(Kombi.GetKombi("Dreier", "3|7|8"));
            _kombis.Add(Kombi.GetKombi("Dreier", "4|10|12"));
            _kombis.Add(Kombi.GetKombi("Dreier", "5|7|1"));
            _kombis.Add(Kombi.GetKombi("Dreier", "6|4|10"));

            _kombis.Add(Kombi.GetKombi("Vierer", "7|1|2|7"));
            _kombis.Add(Kombi.GetKombi("Vierer", "8|4|6|10"));
            _kombis.Add(Kombi.GetKombi("Vierer", "9|7|8|1"));
            _kombis.Add(Kombi.GetKombi("Vierer", "10|10|12|4"));

            _kombis.Add(Kombi.GetKombi("Vierer Würfel", "11|1|10|11"));
            _kombis.Add(Kombi.GetKombi("Vierer Würfel", "12|1|4|5"));
            _kombis.Add(Kombi.GetKombi("Vierer Würfel", "13|4|7|3"));
            _kombis.Add(Kombi.GetKombi("Vierer Würfel", "14|7|9|10"));

            _kombis.Add(Kombi.GetKombi("Vierer Neuner", "15|2|6|14"));
            _kombis.Add(Kombi.GetKombi("Vierer Neuner", "16|6|8|15"));
            _kombis.Add(Kombi.GetKombi("Vierer Neuner", "17|8|12|16"));
            _kombis.Add(Kombi.GetKombi("Vierer Neuner", "18|2|12|13"));

            _kombis.Add(Kombi.GetKombi("Fünfer", "19|1|2|7|8"));
            _kombis.Add(Kombi.GetKombi("Fünfer", "20|4|6|10|12"));

            _kombis.Add(Kombi.GetKombi("Knickfünfer", "21|1|2|4|6"));
            _kombis.Add(Kombi.GetKombi("Knickfünfer", "22|4|6|7|8"));
            _kombis.Add(Kombi.GetKombi("Knickfünfer", "23|7|8|10|12"));
            _kombis.Add(Kombi.GetKombi("Knickfünfer", "24|10|12|1|2"));

            _kombis.Add(Kombi.GetKombi("T-Fünfer", "25|1|2|4|10"));
            _kombis.Add(Kombi.GetKombi("T-Fünfer", "26|1|4|6|7"));
            _kombis.Add(Kombi.GetKombi("T-Fünfer", "27|4|7|8|10"));
            _kombis.Add(Kombi.GetKombi("T-Fünfer", "28|1|7|10|12"));

            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "29|1|10|11|2"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "30|1|10|11|12"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "31|1|4|5|2"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "32|1|4|5|6"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "33|4|7|3|6"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "34|4|7|3|8"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "35|7|9|10|8"));
            _kombis.Add(Kombi.GetKombi("Würfel Fünfer", "36|7|9|10|12"));
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            try
            {
                //int[] istwerte = Werte.GetWerte("8|5").ToArray();
                int[] istwerte = Werte.GetWerte(textBoxEingabe.Text).ToArray();

                List<string> trefferTexte = new List<string>();
                foreach (var kombi in _kombis)
                {
                    if (kombi.Treffer(istwerte))
                    {
                        trefferTexte.Add(kombi.Anzeige());
                    }
                }

                if (trefferTexte.Count == 0)
                {
                    textBoxAusgabe.Text = "Keine Kombi";
                }
                else
                {
                    textBoxAusgabe.Text = string.Join(", ", trefferTexte.ToArray());
                }
            }
            catch (ArgumentException ex)
            {
                textBoxAusgabe.Text = ex.Message;
            }
        }
    }

    public static class Werte
    {
        public static int[] GetWerte(string text)
        {
            if (string.IsNullOrEmpty(text)) throw new ArgumentException("Keine Werte angegeben.");
            string[] felder = text.Split('|');

            List<int> ziel = new List<int>();
            {
                foreach (var feld in felder)
                {
                    int wert;
                    if (!int.TryParse(feld, out wert))
                        throw new ArgumentException("Keine gültiger Wert (\"" + feld + "\").");

                    ziel.Add(wert);
                }
            }
            return ziel.ToArray();
        }
    }

    public class Kombi
    {
        //Eigenschaften:
        private string _Name = string.Empty;
        public string Name { get { return _Name; } }

        private List<int> _Sollwerte = new List<int>();
        public List<int> Sollwerte { get { return _Sollwerte; } }

        public static Kombi GetKombi(string name, string text)
        {
            Kombi ziel = new Kombi();
            {
                ziel._Name = name;
                ziel._Sollwerte = new List<int>(Werte.GetWerte(text));
            }
            return ziel;
        }

        public string Anzeige()
        {
            List<string> solltexte = new List<string>();
            foreach (var sollwert in _Sollwerte)
            {
                solltexte.Add(sollwert.ToString());
            }
            return _Name + ": " + string.Join("|", solltexte);
        }

        public bool Treffer(params int[] istwerte)
        {
            if (istwerte == null) return false;
            if (istwerte.Length != _Sollwerte.Count) return false;
            List<int> istrest = new List<int>(istwerte);

            foreach (var sollwert in _Sollwerte)
            {
                int istrestIndex = istrest.IndexOf(sollwert);
                if (istrestIndex == -1) return false;
                istrest.RemoveAt(istrestIndex);
            }
            return true;
        }
    }
28.05.2019 19:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 426
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von CoLo:
Mein erster Gedanke war...

Ist auch eine Variante, wenn auch durch die Schreibweise etwas schwer zu durchschauen.

In meinem Fall bietet es sich an, auch andere Operatoren zu verwenden außer == und &&.


Die erste Lösung von @Papst finde ich auch sehr gut, allerdings könnte dieses nicht konfiguriert werden.
Ist halt immer die Frage wie weit man gehen will.

SG
29.05.2019 12:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 25.06.2019 12:15