以下脚本显示
“索引超出了数组的范围”
在第
行for (int i = 0; i <u_f.GetLength(1); i++)
当我将其更改为
时for (int i = 0; i <=u_f.GetLength(1); i++)
显示
第“输入字符串的格式不正确”
int uid = Convert.ToInt32(txtbx_id.Text);
行中的错误
float userscore,itemscore,result;
string lineitem, lineuser;
//float[][] a = new float[89395][100];
//float[][] b = new float[1143600][100];
float[][] a = Enumerable.Range(0, 89395).Select(i => new float[100]).ToArray();
float[][] b = Enumerable.Range(0, 1143600).Select(j => new float[100]).ToArray();
//float[,] c = new float[89395, 100];
StreamReader fileitem = new StreamReader("c:\\1.txt");
StreamReader fileuser = new StreamReader("c:\\2.txt");
public Form1()
{
InitializeComponent();
for (int x = 0; x <= 8939500; x++)
{
lineuser = fileuser.ReadLine();
if (!string.IsNullOrEmpty(lineuser))
{
string[] values = lineuser.Split(' ');
int userid, factoriduser;
foreach (string value in values)
{
userid = Convert.ToInt32(values[0]);
factoriduser = Convert.ToInt32(values[1]);
userscore = Convert.ToSingle(values[2]);
a[userid][factoriduser] = userscore;
}
}
}
for (int y = 0; y <= 114360000; y++)
{
lineitem = fileitem.ReadLine();
if (!string.IsNullOrEmpty(lineitem))
{
string[] valuesi = lineitem.Split(' ');
int itemid, factoriditem;
foreach (string value in valuesi)
{
itemid = Convert.ToInt32(valuesi[0]);
factoriditem = Convert.ToInt32(valuesi[1]);
itemscore = Convert.ToSingle(valuesi[2]);
b[itemid][factoriditem] = itemscore;
}
}
}
}
public float dotproduct(int userid,int itemid)
{
//get the score of 100 from user and item to dotproduct
float[] u_f = a[userid];
float[] i_f = b[itemid];
for (int i = 0; i <u_f.GetLength(1); i++) //<----error
{
result += u_f[userid] * i_f[itemid];
}
return result;
}
private void btn_recomm_Click(object sender, EventArgs e)
{
if(txtbx_id.Text==null)
{
MessageBox.Show("please insert user id");
}
if (txtbx_id.Text != null && txtbx_itemid==null)
{
int sc = Convert.ToInt32(txtbx_id.Text);
if (sc>=0 &&sc<=89395)
{
for (int z=0;z<=1143600;z++)
{
dotproduct(sc,z);
}
Hashtable hashtable = new Hashtable();
//put the result in hashtable
foreach (DictionaryEntry entry in hashtable)
{
System.Console.WriteLine("{0}, {1}", entry.Key, entry.Value);
}
}
}
if (txtbx_id!=null && txtbx_itemid!=null)
{
int uid = Convert.ToInt32(txtbx_id.Text); //<----error
int iid = Convert.ToInt32(txtbx_itemid.Text);
{
if (uid>=0 && uid<=89395 && iid>=0 && iid<=1143600)
{
dotproduct(uid,iid);
MessageBox.Show("The Score of user id "+uid+" is "+result);
}
}
}
答案 0 :(得分:4)
“索引超出了数组的范围”
问题1:您正在访问无效维度中的GetLength(1)
元素。
你只有一维数组,但访问第二维长度一如既往,数组索引从零开始。
解决方案1:您应该使用GetLength(0)
或Length
,因为您的数组是单维数组。
Array.GetLength(0)
返回数组第一维中的元素数。
来自MSDN:
获取一个32位整数,表示该元素的数量 数组的指定维度。
替换它:
for (int i = 0; i <u_f.GetLength(1); i++)
有了这个:
for (int i = 0; i <u_f.GetLength(0); i++)
或与
for (int i = 0; i <u_f.Length; i++)
问题2:您正在null
直接检查TextBox
控制,但不会检查TextBox
Text/Value
。所以这里发生的是即使用户没有在你的文本框中输入任何值,if条件也不会失败,因为TextBox
不是null。所以它进入if块但是当它尝试将该空字符串/值转换为整数时使用以下声明:
int uid = Convert.ToInt32(txtbx_id.Text); //<----error
正如你所说的那样抛出异常。
解决方案2 :您需要执行null
检查TextBox
值TextBox1.Text!=null
建议1:您可以使用String.IsNullOrWhiteSpace()
方法验证其值是Null,Empty还是WhiteSpace。
建议2:如果要在将用户输入解析为整数时避免运行时异常,则需要使用int.TryParse()
方法。
替换它:
if (txtbx_id!=null && txtbx_itemid!=null)
{
int uid = Convert.ToInt32(txtbx_id.Text); //<----error
int iid = Convert.ToInt32(txtbx_itemid.Text);
{
if (uid>=0 && uid<=89395 && iid>=0 && iid<=1143600)
{
dotproduct(uid,iid);
MessageBox.Show("The Score of user id "+uid+" is "+result);
}
}
}
有了这个:
if (!String.IsNullOrWhiteSpace(txtbx_id.Text) &&
!String.IsNullOrWhiteSpace(txtbx_itemid.Text))
{
int uid,iid;
if(int.TryParse(txtbx_id.Text,out uid) && int.TryParse(txtbx_itemid.Text,out iid))
{
if (uid>=0 && uid<=89395 && iid>=0 && iid<=1143600)
{
dotproduct(uid,iid);
MessageBox.Show("The Score of user id "+uid+" is "+result);
}
}
}
答案 1 :(得分:1)
参考问题:
int uid = Convert.ToInt32(txtbx_id.Text); //<----error
在使用可能与预期不同的输入时尝试使用Int32.TryParse
:
int uid;
if (!Int32.TryParse(txtbx_id.Text, out uid))
{
MessageBox.Show("Input is not a number! Try again!");
}
答案 2 :(得分:1)
你的两个错误是无关的。
的原因是你收到错误的原因for (int i = 0; i < u_f.GetLength(1); i++)
是因为u_f有一个一维,但是你要求第二个维度的长度(GetLength
采用一个基于0的维度索引)
只需使用
for (int i = 0; i < u_f.Length; i++)
您的其他错误是由txtbx_id.Text
未表示有效int
值引起的。
此外,此方法保证失败,因为长度为x
的数组在array[x]
处没有值(array[x-1]
是最后一个数组中的项目):
public float dotproduct(int userid,int itemid)
{
//get the score of 100 from user and item to dotproduct
float[] u_f = a[userid];
float[] i_f = b[itemid];
for (int i = 0; i <u_f.GetLength(1); i++)
{
result += u_f[userid] * i_f[itemid]; // this is GUARANTEED to fail
}
return result;
}
我想你想要
for (int i = 0; i <u_f.Length; i++)
{
result += u_f[i] * i_f[i];
}
代替。
答案 3 :(得分:0)
当我在一个字符串中有一个 单个花括号 时,我也遇到了这个错误(例外情况并非如此有用):
string result = string.Format("{label: '{0}, {1}', children: [", prefixLabel, prefixPointer);
----------------------------------------------- ---- ^ -----------------------------
这种情况下的解决方案是双花括号:{{
EG:
string result = string.Format("{{label: '{0}, {1}', children: [", prefixLabel, prefixPointer);
----------------------------------------------- ---- ^ -----------------------------
我发现如果我在单词标签之前移除了大括号,问题就消失了,所以我用Google搜索了如何逃避它。这是我在转义花括号时发现的original SO Question链接,如果您需要更多阅读,它还有更多链接。
希望这可以帮助那些对“输入字符串格式不正确”的人感到困惑,因为他们的字符串中没有整数,就像我刚才的经历一样。