除非0或10,否则StringBuilder不会在字符串的开头附加int
本文关键字:字符串 开头 int StringBuilder 否则 除非 | 更新日期: 2023-09-27 18:03:09
我有一个保龄球游戏,它获取碗的列表,然后通过这段代码运行它们,以生成一个字符串,该字符串遍历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();
}
}
任何帮助都是非常感激的,我已经卡住了几天试图让这个工作…
output.ToString();
是一个纯函数,您不使用它的返回值(因此,您正在转换为字符串,然后丢弃该字符串而不使用/存储/返回它)。我猜你真的想要返回完全构建和格式化的字符串,而不是StringBuilder实例。用途:
return output.ToString();
也就是说,其他代码路径也不应该产生值。
在浏览了其他人的所有评论和建议后,我删除了阻止我查看捕获错误的try-catch部分。然后,添加debug.log语句来帮助找到正确的位置,并使用Unity的内置错误来发现这根本不是字符串的错误。它试图找到一个不存在的索引rolls[i]-1
。经过几次尝试后,我发现如果我将else if (rolls[i-1] + rolls[i] == 10 && rolls.Count > 1)
更改为嵌套的if语句并使用output.Length
而不是rolls.Count
,它将不再返回错误。谢谢大家谁试图帮助我解决这个问题,你指出了我在正确的方向,真的让我思考!下面是完成后的代码:
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();
}