Laden...

dynamische If-Abfrage

Erstellt von Xargus vor 4 Jahren Letzter Beitrag vor 4 Jahren 2.784 Views
X
Xargus Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren
dynamische If-Abfrage

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:


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)


    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

    
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

P
441 Beiträge seit 2014
vor 4 Jahren

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:


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/api/system.func-2?view=netframework-4.8

T
2.219 Beiträge seit 2008
vor 4 Jahren

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/api/system.predicate-1?view=netframework-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

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

463 Beiträge seit 2009
vor 4 Jahren
      
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

X
Xargus Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren

Guten Morgen,

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

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".

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

T
461 Beiträge seit 2013
vor 4 Jahren
  
    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:


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:


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]

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

6.911 Beiträge seit 2009
vor 4 Jahren

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ü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

X
Xargus Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren

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


//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])]) }
            }
          }
        });
      }
    }

T
2.219 Beiträge seit 2008
vor 4 Jahren

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

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor 4 Jahren

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


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).

X
Xargus Themenstarter:in
9 Beiträge seit 2019
vor 4 Jahren

Hi,

T-Virus wie meinst du das?

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.

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

4.931 Beiträge seit 2008
vor 4 Jahren

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

T
461 Beiträge seit 2013
vor 4 Jahren

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:


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 😉

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

C
224 Beiträge seit 2009
vor 4 Jahren

Mein erster Gedanke war:



    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;
        }
    }

T
461 Beiträge seit 2013
vor 4 Jahren

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

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄