除非 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();
}
我有一个保龄球游戏,它获取碗列表,然后通过此代码运行它们以生成一个字符串,该字符串通过 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();
}