优化代码,将多个int变量输出到String中。

问题描述 投票:1回答:4

我声明了几个int变量。

[SerializeField] private int currentHP, currentMP, maxHP, maxMP, attack, intelligence, defense, speed, critChance;

我想把它们输出到一个写着 "你的统计数据是xx "的文本中。我使用了下面的代码和 行得通:

if (maxHP > 0)
{
stats += string.Format("\n Your stat is {0}", maxHP);
}

但是,我想知道是否有办法避免为每个int复制粘贴这段代码。有可能吗?

谢谢!我有几个int变量被声明:

c# unity3d optimization
4个回答
3
投票

首先,把每个数据都放到一个数组中。

int[] statsArray = { currentHP, currentMP, maxHP, maxMP, attack, intelligence, defense, speed, critChance };

然后,用一个 LINQ查询 来为每个统计数字创建一个字符串。请注意,您可以使用 串插:

var strings = from stat in statsArray 
                where stat > 0 // filters out the non-positive stats, like your if statement does
                select $"\nYour stat is {stat}."; // string interpolation

然后,将这些字符串连接起来,使用 string.Concat:

stats = string.Concat(strings);

0
投票

一个简单的方法,不需要用另一种方法来声明你的变量,就是创建一个函数。

private string GetStatString(int stat) {
    if (stat> 0)
    {
       return string.Format("\n Your stat is {0}", maxHP);
    }

    return "";
}

而在你的代码中。

    stats += GetStatString(maxpHP) + GetStatString(maxMp); // etc

如果你能把这些加到一个数组里 那工作就容易多了 你可以结合@扫地者的回答来做。


0
投票

扫码者回答可能是最好的方法。

但是,如果你真的不想重复,甚至连字段名都不想重复,你可以使用反射来获取所有的 int的类中。

        var strings = GetType().GetFields(BindingFlags.NonPublic|BindingFlags.Instance);
            .Select(field => field.GetValue(this))
            .OfType<int>()
            .Where(value => value > 0)
            .Select(value => $"Your stat is {value}");
        var concatenated = string.Join("\n", strings);

如果你想频繁地迭代所有的统计信息,也许使用一个字典或者一个 stringint 元组。


0
投票

你也可以使用System.Reflection,以防你需要在运行时获取值,而不需要把字段放在一个数组中,并避免调整你的代码来打印功能。

    public string GetStats()
    {
        string stats = string.Empty;

        // Get a list of FieldInfo objects.
        var fieldsInfo = GetType().GetFields(BindingFlags.NonPublic
                        | BindingFlags.Instance)
                        .Where(field => field.FieldType == typeof(int)).ToList();


        foreach (var field in fieldsInfo)
        {
            int fieldValue = (int)field.GetValue(this);

            if (fieldValue > 0)
            {
                stats += string.Format("\n Your stat is {0}", fieldValue);
            }
        }

        return stats;
    } 
© www.soinside.com 2019 - 2024. All rights reserved.