在for循环中为object分配值

时间:2015-11-16 09:43:34

标签: c# loops oop

假设我有一个MyCharacter类的对象Character,它具有以下属性:HealthManaMoveSpeed
从另一种方法我得到一个包含这些统计数据的字符串如下:
"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。 这样的事情甚至可能吗?

4 个答案:

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