2015-11-16 8 views
5

Допустим, у меня есть объект MyCharacter класса Character, который обладает следующими свойствами: Health, Mana, MoveSpeed.
Из другого метода я получаю строку, которая содержит эти статистические данные, следующим образом:
"Health: 100 Mana: 100 MoveSpeed: 100"
Теперь я хочу присвоить эту статистику моему объекту. Моя текущая попытка:Присвоить значения объекта в цикл

// stats is the string I showed above 
var statsArray = stats.Split(' '); 
for (var i = 0; i < statsArray.Length; i++) 
{ 
    switch(statsArray[i]) 
    { 
     default: 
      break; 
     case "Health:": 
      MyCharacter.Health = statsArray[i+1]; 
      break; 
     case "Mana:": 
      MyCharacter.Mana = statsArray[i+1]; 
      break; 
     case "MoveSpeed:": 
      MyCharacter.MoveSpeed = statsArray[i+1]; 
      break; 
    } 
} 

Дело в том, что я знаю порядок статистики. Это всегда Здоровье, затем Мана, затем MoveSpeed. Поэтому я ищу способ упростить его, а именно избавиться от этого switch (так как фактический Character здесь имеет 18 характеристик, и это не совсем так хорошо, как есть).
Моя идея будет проходить через массив и сообщит программе, чтобы назначить первое число, которое он находит для Здоровья, второе - Мане, а третье - MoveSpeed.
Возможно ли что-нибудь подобное?

+2

ли вы теперь имеете любую заботу/производительность/ошибку на Переключатель случай? почему вы хотели бы изменить? Если нет, для меня я бы предпочел использовать коммутатор, проще для отладки и чтения. – User2012384

+0

Если вы знаете правильный порядок, то почему в нем есть метки? Есть ли причина не иметь, например, '100,100,100'? – Luaan

+0

Единственный способ, которым вы сможете динамически загружать в свойства, не зная, что их имена впереди, - [использовать отражение (с соответствующим увеличением производительности и увеличением сложности)] (http://stackoverflow.com/questions/771524/how -slow-это-отражение). TBH Я не вижу ничего плохого в том, как это происходит сейчас. [Любой дурак может написать код, который компьютер может понять. Хорошие программисты пишут код, который люди могут понять] (http: // stackoverflow.com/questions/522828/is-code-for-computers-or-for-people) – Liam

ответ

7

Поскольку вы знаете точный формат, вы можете просто открыть индексы непосредственно:

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

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

Вы можете также использовать регулярное выражение для этого, который имеет преимущество в том, что в очередной раз подтверждает свой шаблон (так что если есть случай, который делает не соответствовать вашему формату, вы получите исключение):

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; 

Примечание: вы, вероятно, хотите, чтобы эти свойства содержат целые числа, так что вы можете рассчитывать со значениями, так что вы должны позвонить int.Parse() по каждому из значений.

+0

Я использовал последний день, чтобы попасть в регулярные выражения и, черт возьми, это абсолютно идеально, спасибо, человек :) – Wilsu

0

Вы можете, просто поместить пробел или любой заданный символ в качестве разделителя между значениями. Если заказ всегда один и тот же, у вас не будет проблем. Если вы читаете строку из файла, пишите символы, которые мне более неэффективны, чем запись данных в двоичном формате в виде необработанного файла, состоящего из поплавков. файл будет sizeof (float) * 18. Вы выбираете семантику каждого значения.

+0

Там уже есть разделитель ...? Вы прочитали вопрос? – poke

1

Вы можете использовать словарь. Это будет очень легко и просто.

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

затем

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

Как это упрощает синтаксический анализ строк? И если вы уже используете другую структуру, почему бы не поместить ее в объект символа напрямую? – poke

+0

как вы собираетесь создавать словарь. вы добавили свои ценности. а не из строки, которая здесь является проблемой ОП. –

+0

Правильно, я не заметил разбор проблемы. –

0

Регулярные выражения является лучшим способом для разбора строки.

Проверьте это:

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"); 
    } 
} 
Смежные вопросы