2015-11-16 13 views
5

Sagen wir, ich habe ein Objekt MyCharacter der Klasse Character, das die folgenden Eigenschaften aufweist: Health, Mana, MoveSpeed.
Von einer anderen Methode bekomme ich eine Zeichenfolge, die diese Statistiken wie folgt enthält:
"Health: 100 Mana: 100 MoveSpeed: 100"
Ich möchte jetzt diese Statistiken zu meinem Objekt zuweisen. Mein aktueller Versuch ist dies:Assign Werte für Schleife Objekt in

Die Sache ist jetzt, dass ich die Reihenfolge der Statistiken kenne. Es ist immer Gesundheit, dann Mana, dann MoveSpeed. So suche ich nach einer Möglichkeit, es zu vereinfachen, nämlich dieses switch loszuwerden (da das tatsächliche Character hier 18 Statistiken hat und es nicht gerade gut aussieht, wie es ist).
Meine Idee wäre, das Array durchzugehen und dem Programm mitzuteilen, dass es die erste Nummer, die es findet, der Gesundheit, die zweite Mana und die dritte MoveSpeed ​​zuweist.
Ist so etwas überhaupt möglich?

+2

Haben Sie jetzt irgendwelche Bedenken/Leistung/Fehler auf Schaltergehäuse mit? warum würdest du gerne wechseln? Wenn nicht, würde ich lieber Switch-Case verwenden, es ist einfacher zu debuggen und zu lesen – User2012384

+0

Wenn Sie die richtige Reihenfolge kennen, warum haben die Etiketten an erster Stelle? Gibt es einen Grund, z.B. '100,100,100'? – Luaan

+0

Die einzige Möglichkeit, dynamisch in Eigenschaften zu laden, ohne ihre Namen im Voraus zu kennen, ist die Verwendung von Reflektion (mit dem damit verbundenen Leistungseinbruch und der Erhöhung der Komplexität)] (http://stackoverflow.com/questions/771524/how) -Slow-ist-Reflexion). TBH Ich sehe nichts falsch daran, wie es jetzt ist. [Jeder Dummkopf kann Code schreiben, den ein Computer verstehen kann. Gute Programmierer schreiben Code, den Menschen verstehen können] (http: // stackoverflow.com/questions/522828/is-code-for-computer-or-for-people) – Liam

Antwort

7

Da Sie das genaue Format kennen, können Sie die Indizes zugreifen nur direkt:

string stats = "Health: 100 Mana: 100 MoveSpeed: 100"; 

var statsArray = stats.Split(' '); 
MyCharacter.Health = statsArray[1]; 
MyCharacter.Mana = statsArray[3]; 
MyCharacter.MoveSpeed = statsArray[5]; 

Sie könnten auch einen regulären Ausdruck für diese, was den Vorteil hat, dass es weiter Ihr Muster bestätigt (also wenn es ein Fall ist, die nicht entsprechen Ihr Format des Fall ist, eine Ausnahme) erhalten:

var m = Regex.Match(stats, @"Health: (\d+) Mana: (\d+) MoveSpeed: (\d+)"); 

MyCharacter.Health = m.Groups[1].Value; 
MyCharacter.Mana = m.Groups[2].Value; 
MyCharacter.MoveSpeed = m.Groups[3].Value; 

Hinweis: Sie wollen wahrscheinlich diese Eigenschaften ganze Zahlen enthalten, so dass Sie mit den Werten berechnen können, so dass Sieanrufen solltenauf jedem der Werte.

+0

Ich habe den letzten Tag benutzt um in reguläre Ausdrücke zu kommen und verdammt, das ist absolut perfekt, danke, Mann :) – Wilsu

0

Sie können einfach ein Leerzeichen oder ein beliebiges Zeichen als Trennzeichen zwischen die Werte setzen. Wenn die Reihenfolge immer gleich ist, haben Sie keine Probleme. Wenn Sie die Zeichenfolge aus der Datei lesen, ist das Schreiben von Zeichen ineffizienter als das Schreiben der Daten in Binärdateien als eine rohe Datei, die aus Gleitkommazahlen besteht. die Datei wäre sizeof (float) * 18. Sie wählen die Semantik jedes Wertes.

+0

Da ist schon ein Trennzeichen ...? Hast du die Frage gelesen? – poke

1

Sie können ein Wörterbuch verwenden. Es wird sehr einfach und einfach sein.

Dictionary<string, int> dictionary =new Dictionary<string, int>(); 
dictionary.Add("health",100); 
dictionary.Add("mana",100); 
dictionary.Add("speed",40); 

dann

mycharacter.Health=dictionary["health"]; 
mycharacter.Health=dictionary["mana"]; 
mycharacter.Health=dictionary["speed"]; 
+0

Wie vereinfacht dies die String-Analyse? Und wenn Sie bereits eine andere Struktur verwenden, warum nicht direkt in das Zeichenobjekt einfügen? – poke

+0

Wie Sie ein Wörterbuch einrichten. Du hast deine Werte selbst hinzugefügt. nicht von der Schnur, die das Problem von OP hier ist. –

+0

Richtig, ich habe das Parsing-Problem nicht bemerkt. –

0

Regular Expressions ist der beste Weg, um die Zeichenfolge zu analysieren.

prüfen dies:

public class Character 
{ 
    public int Health; 
    public int Mana; 
    public int MoveSpeed; 

    public static Character FromString(string characterData) 
    { 
     MatchCollection matches = Regex.Matches(characterData, "[A-Za-z]+: ([\\d]+)"); 
     Character myCharacter = new Character(); 
     myCharacter.Health = Convert.ToInt32(matches[0].Groups[1].Value); 
     myCharacter.Mana = Convert.ToInt32(matches[1].Groups[1].Value); 
     myCharacter.MoveSpeed = Convert.ToInt32(matches[2].Groups[1].Value); 
     return myCharacter; 
    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Character myCharacter = Character.FromString("Health: 100 Mana: 110 MoveSpeed: 120"); 
    } 
}