我有一个程序的一部分,它有生成代码的方法(HelmID),生成它,我从文本文件中读取以获取最新的HelmID。这是我的文本文件。
T001#C001#H001#FullFace#S001#
T001#C001#H002#FullFace#S002#
问题是,该方法不会生成H003(在H002之后)并且给出错误消息'索引超出了数组的界限'。这是我的方法代码。
public string newHelmetCode()
{
string Str, HelmetCode;
int HelmetInt;
string[] strArray = new string[5];
if (new FileInfo("TransDetail.txt").Length == 0)
{
HelmetCode = "H001";
return HelmetCode;
}
else
{
Str = File.ReadLines("TransDetail.txt").Last();
strArray = Str.Split(new string[] { "#" }, StringSplitOptions.None);
HelmetCode = strArray[2].Substring(1, 3);
HelmetInt = Convert.ToInt32(HelmetCode) + 1;
if (HelmetInt <= 9)
{
HelmetCode = "H00" + HelmetInt.ToString();
}
else if (HelmetInt <= 99)
{
HelmetCode = "H0" + HelmetInt.ToString();
}
else if (HelmetInt <= 999)
{
HelmetCode = "H" + HelmetInt.ToString();
}
return HelmetCode;
}
}
错误来自此代码HelmetCode = strArray[2].Substring(1, 3);
。它应该生成原因我使用Substring(并转换为int)来获取文本文件最后一行的最新数字。任何回复都会适用
答案 0 :(得分:1)
也许在最后一行之后有一个换行符或类似的东西。您可以将LINQ用于唯一的relvant行:
var lineFields = File.ReadLines("TransDetail.txt")
.Select(line => line.Split(new string[] { "#" }, StringSplitOptions.None))
.Where(arr => arr.Length >= 5)
.ToArray();
if(lineFields.Length > 0)
{
string[] lastFields = lineFields.Last();
int helmetInt;
bool valid = int.TryParse(lastFields[2].Substring(1), out helmetInt);
// check if it's valid otherwise log/throw error
// you dont need the if...else if...else if... part, this is enough:
string helmetCode = "H" + helmetInt.ToString("D3");
// ...
}
答案 1 :(得分:0)
显然,fun <T> mutableReplicate(n:Int, x:T) : MutableList<T>{
val xs = mutableListOf<T>()
for (i in 1..n){
xs.add(x)
}
return xs
}
中的项目少于三个。
你应该先查看长度。 (我的猜测是最后一行是空行btw):
strArray
您还应该检查所需字符串的长度if (strArray.Length >= 3)
{
// do
}
,因为在Substring
时,您将获得length < 1
。
所以检查长度:
ArgumentOutOfRangeException