【问题标题】:C# How to convert a struct type list into a string? [duplicate]C#如何将结构类型列表转换为字符串? [复制]
【发布时间】:2017-09-22 03:22:36
【问题描述】:

我在 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,.."
}
}

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

【问题讨论】:

  • 您要打印什么?
  • @KeithNicholas 我想打印出这样的东西
  • "Monster_Zombie, 100, 20, S_IDLE, Monster_Donkey, 80, 30, S_IDLE, Monster_Chicken, 120, 10, IDLE,.."

标签: c# string list unity3d casting


【解决方案1】:

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

接下来我将在 Monster 中覆盖 ToString()。假设您可以使用 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));

【讨论】:

    【解决方案2】:

    您可以在 Monster 上覆盖 ToString,但如果您希望在不同上下文中显示事物的方式具有灵活性,那么我会将您渲染事物的方式与模型分开

    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())); 
    

    【讨论】:

    • 嗯,不过只打印了前两个怪物数据,我一共有5个怪物。 @基思尼古拉斯
    • 应该没啥限制,,,,,我只是改成console打印出来了,得到了5,debug.log可能有问题\r\n,所以可能放|取而代之的是什么
    • 啊,|作品!非常感谢:)
    猜你喜欢
    • 2020-03-12
    • 2019-05-18
    • 2012-05-23
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2013-07-07
    相关资源
    最近更新 更多