索引超出了数组的边界
本文关键字:边界 数组 索引 | 更新日期: 2023-09-27 17:51:12
当我尝试运行应用程序时,它在float[] u_f = a[userid];
行显示Index was outside the bounds of the array
任何想法?另外,用户ID可以是任何整数,但我取整数的索引,取值范围在(item为0,1143600)和(user为0,89395)之间,并以此为基础进行计算。然后,我的计算是基于存储在数组a中的userid
值的索引,而不是基于userid
的值。提前感谢
float[][] a = Enumerable.Range(0, 89395).Select(i => new float[100]).ToArray();
float[][] b = Enumerable.Range(0, 1143600).Select(j => new float[100]).ToArray();
int[] c = new int[1258038];
int[] d = new int [92160];
........
public float dotproduct(int userid, int itemid)
{
result = 0f;
float[] u_f = a[userid]; // <----Error Line (index was outside the bounds of array)
float[] i_f = b[itemid];
for (int i = 0; i < u_f.Length; i++)
{
result += u_f[i] * i_f[i];
}
return result;
}
private void btn_recomm_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(txtbx_id.Text) && String.IsNullOrEmpty(txtbx_itemid.Text) && !String.IsNullOrEmpty(txtbx_noofrecomm.Text))
{
int sc = Convert.ToInt32(txtbx_id.Text);
int n = Convert.ToInt32(txtbx_noofrecomm.Text);
int userseq=Array.IndexOf(d, sc);
var results = new List<float>(1143600);
for (int z = 0; z <= 1143600; z++)
{
results.Add(dotproduct(userseq, z));
}
var sb1 = new StringBuilder();
foreach (var resultwithindex in results.Select((r, index) => new { result = r, Index = index }).OrderByDescending(r => r.result).Take(n))
{
sb1.AppendFormat("{0}: {1}", d[resultwithindex.Index], resultwithindex.result);
sb1.AppendLine();
}
MessageBox.Show(sb1.ToString());
}
if (!String.IsNullOrEmpty(txtbx_id.Text) && !String.IsNullOrEmpty(txtbx_itemid.Text) && String.IsNullOrEmpty(txtbx_noofrecomm.Text))
{
int uid = Convert.ToInt32(txtbx_id.Text);
int iid = Convert.ToInt32(txtbx_itemid.Text);
int userseq0 = Array.IndexOf(d, uid);
int itemseq0 = Array.IndexOf(c, iid);
dotproduct(userseq0, itemseq0);
MessageBox.Show("The Score of item id " + itemseq0 + " is " + result);
}
表示userID
的值大于数组a
的最大索引号。最大索引为count - 1。
错误信息中提到。
而且,看起来a
是二维的。这是你的问题吗?
显然dotproduct
被调用时userid
的值等于或大于a.Length
如果不应该发生,那么在声明u_f
array之前添加这一行:
Debug.Assert(a.Length > userid);
当然,这并不能解决问题本身,但它可以确保当您在测试时发生这种情况时,它不会被忽视或忽略。
作为旁注,更清晰的变量名将使您更容易阅读代码并找出问题。如果可能的话,使用实际类型而不是锯齿数组可能也会有所帮助。
将[userid]替换为
a[userid-1]