除非 0 或 10,否则 StringBuilder 不会将 int 附加到字符串的开头

StringBuilder not appending int to beginning of string unless 0 or 10

我有一个保龄球游戏,它获取碗列表,然后通过此代码运行它们以生成一个字符串,该字符串通过 UI 上的帧。如果用户将碗扔到排水沟 (0) 或击球 (10),代码将正常工作。但是,如果它介于 1 和 9 之间,则无法生成字符串。为什么是这样?我已经搜索并尝试了许多其他方法来做到这一点,但这似乎是唯一可行的方法。

public static StringBuilder FormatRolls (List<int> rolls) {
    StringBuilder output = new StringBuilder();

    for (int i=0; i < rolls.Count; i++) {
        if (rolls.Count >= 19 && rolls[i] == 10) {                                          //Bonus End-Frame Strike
            output.Append ("X");
        } else if (rolls[i] == 0) {                                                         //Gutter
            output.Append ("-");
        } else if (rolls[i-1] + rolls[i] == 10 && rolls.Count > 1) {                                            //Spare
            output.Append ("/");
        } else if (rolls[i] == 10 && rolls[i+1] == 0) {                                     //Strike
            output.Append ("X");
        } else {                                                                            //Normal bowls 1-9
            output.Append (rolls[i].ToString());
        }
    }

    output.ToString();

    return output;
}

这是随后写入所有帧的代码:

public void FillRolls (List<int> rolls) {
    StringBuilder scoresString = FormatRolls(rolls);
    for (int i=0; i<scoresString.Length; i++) {
        frameText[i].text = scoresString[i].ToString();
    }
}

非常感谢任何帮助,我已经坚持了 DAYS 试图让它工作......

output.ToString(); 是一个纯函数,您没有使用它的 return 值(因此,您正在转换为一个字符串,然后在没有 using/storing/returning 的情况下丢弃该字符串) .我猜你真的想要 return 完全构建和格式化的字符串,而不是 StringBuilder 实例。使用:

return output.ToString();

也就是说,其他代码路径也不应该产生值。

在浏览了其他人的所有评论和建议后,我删除了阻止我看到我的 catch 错误的 try-catch 部分。然后,添加 debug.log 语句来帮助找到正确的位置,并使用 Unity 的内置错误来发现这根本不是字符串的错误。它试图找到一个不存在的索引 rolls[i]-1。经过几次尝试,我发现如果我将 else if (rolls[i-1] + rolls[i] == 10 && rolls.Count > 1) 更改为嵌套的 if 语句并使用 output.Length 而不是 rolls.Count,它将不再 return 错误。感谢所有试图帮助我解决这个问题的人,你们为我指明了正确的方向,让我开始思考!这是完成的代码:

public static string FormatRolls (List<int> rolls) { StringBuilder output = new StringBuilder();

    for (int i=0; i < rolls.Count; i++) {
        if (rolls.Count >= 19 && rolls[i] == 10) {                                          //Bonus End-Frame Strike
            output.Append ("X");
        } else if (rolls[i] == 0) {                                                         //Gutter
            output.Append ("-");
        } else if (rolls[i] == 10 && output.Length % 2 == 0) {                              //Strike
            output.Append (" X");
        } else if (output.Length >= 1 && output.Length % 2 != 0) {                                                  //Spare
            if (rolls[i-1] + rolls[i] == 10) {
                output.Append ("/");
            }
        } else {                                                                            //Normal bowls 1-9
            output.Append (rolls[i]);
        }
    }

    return output.ToString();
}