C#如何将结构类型列表转换为字符串?

时间:2017-09-22 03:22:36

标签: c# string list unity3d casting

我正在使用Unity进行游戏,需要帮助将结构列表转换为字符串。我下面的代码放在一个名为MonsterHandler的类中。

public enum S_STATE
{
    S_IDLE,
    S_PATROL,
    S_ATTACK,
    NONE
}

public struct MONSTERS
{
    public string Name;
    public int Health;
    public int Damage;
    public S_STATE State;
};

public List<MONSTERS> monsterList= new List<MONSTERS>();

void Start()
{
   // add data into the monsterList
   // Debug.Log(monsterList.Count); // print out 5

   Debug.Log(monsterList.ToArray()); //printed out "MonsterHandler + MONSTERS"
   // i want to do something like this
   // "Monster_Zombie, 100, 20, S_IDLE, Monster_Donkey, 80, 30, S_IDLE,  Monster_Chicken, 120 , 10, IDLE,.."
}
}

有没有办法将我的结构列表转换为字符串[],然后转换为字符串?或者还有其他方式

2 个答案:

答案 0 :(得分:4)

我首先重命名类型(和枚举值)以遵循.NET命名约定并指示结构代表单个怪物。 不幸的IMO认为,可变结构在Unity中很常见,但我将这部分放在一边。

我将在ToString()中覆盖Monster。假设您可以使用C#6功能,字符串插值使这非常简单。

最后,要将怪物列表转换为字符串,您需要使用string.Join。呼叫的确切性质取决于您所拥有的内容 - 如果您仍然以.NET 3.5为目标,那么它有点难看。但你最终得到的结论是:

public enum State
{
    None, // Idiomatically value 0 in .NET
    Idle,
    Patrol,
    Attack
}

public struct Monster
{
    public string Name;
    public int Health;
    public int Damage;
    public State State;

    // Adjust this as required
    public override string ToString() =>
        $"Name: {Name}; Health: {Health}; Damage: {Damage}; State: {State}";
}

public List<Monster> monsters = new List<Monster>();

void Start()
{
    Debug.Log(string.Join(", ", monsters.Select(m => m.ToString().ToArray());
}

请注意,这是一项昂贵的操作 - 您可能只想在调试时执行此操作。 (我不知道对Debug.Log的来电是否在Unity中有条件。)

在.NET 4及更高版本中,您只需使用

即可
Debug.Log(string.Join(", ", monsters));

答案 1 :(得分:3)

你可以在Monster上覆盖Debug.Log(string.Join("\r\n", monsterList.Select(monster => $"{monster.Name}, {monster.Health}, whatever") .ToArray())); ,但是如果你想要在不同的上下文中显示事物的灵活性,那么我将保留你如何将事物与模型分开

Console.WriteLine(string.Join("\r\n",monsterList.Select(monster => $"{monster.Name} {monster.Health} {monster.Damage} {monster.State}").ToArray())); 

使用控制台...

{{1}}

enter image description here