2015-11-16 77 views
5

比方说,我有类Character,它具有以下属性的对象MyCharacterHealthManaMoveSpeed
从不同的方法,我得到它包含这些统计如下字符串:
"Health: 100 Mana: 100 MoveSpeed: 100"
我现在想这些统计数据分配给我的对象。我目前的尝试是这样的:分配值对象在for循环

// 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个统计数据,并且它看起来不太好看)。
我的想法是通过数组并告诉程序将其找到的第一个数字分配给Health,第二个数字分配给Mana,第三个分配给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

你将如何设置字典。你增加了你的自我价值。不是从这里OP的问题的字符串。 –

+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"); 
    } 
}