Оптимизировать код для вывода нескольких переменных типа int в строку - PullRequest
1 голос
/ 07 мая 2020

У меня объявлено несколько переменных типа 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. Возможно ли это?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 07 мая 2020

Сначала поместите каждую статистику в массив:

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 голосов
/ 07 мая 2020

Вы также можете использовать 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;
    } 
0 голосов
/ 07 мая 2020

Ответ Sweepers, вероятно, лучший подход.

Однако, если вы действительно не хотите повторяться, даже не имена полей, вы можете использовать отражение, чтобы получить все int s в class.

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

Если вы хотите часто перебирать всю статистику, возможно, лучше использовать словарь или список кортежей string и int.

0 голосов
/ 07 мая 2020

Простым способом, без объявления ваших переменных другим способом, было бы создание функции

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

    return "";
}

И в вашем коде:

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

Если вы можете добавить их в массив, тогда работа станет намного проще, и вы можете комбинировать с ответом @Sweepers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...