假设我有一个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;
}
}
现在的事情是,我知道统计数据的顺序。它总是健康,然后是Mana,然后是MoveSpeed。所以我正在寻找一种简化它的方法,即摆脱这个switch
(因为实际的Character
这里有18个统计数据并且看起来不是很好看)。
我的想法是通过数组并告诉程序将它找到的第一个数字分配给Health,第二个分配给Mana,第三个分配给MoveSpeed。
这样的事情甚至可能吗?
答案 0 :(得分: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()
。
答案 1 :(得分: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"];
答案 2 :(得分:0)
您可以在值之间放置一个空格或任何给定字符作为分隔符。如果订单始终相同,您将不会遇到问题。如果你正在从文件中读取字符串,那么写字符比将二进制数据写成由浮点数组成的原始文件效率更低。该文件将是sizeof(float)* 18。您可以选择每个值的语义。
答案 3 :(得分: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");
}
}