返回-1作为变量的值;
本文关键字:变量 返回 | 更新日期: 2023-09-27 17:51:18
当我尝试运行应用程序时,它显示索引在float[]u_f=a[userid]行的数组边界之外;当我检查userid的值时,它是-1;知道吗?PS。用户ID可以是每个整数,但我取的是介于(0, 1143600 for item)
和(0, 89395 for user)
之间的整数的索引,我的计算就是基于此。然后,我的计算是基于存储在数组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-The value of user id is -1)
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);
}
您的问题是这一行:
int userseq=Array.IndexOf(d, sc);
大概是返回-1
,然后将其传递到您的点产品函数中,从而导致它失败。在d
中找不到sc
的情况下,您需要决定应用什么逻辑并实现它。
尽管正如其他人所说,验证你对网络产品的输入将帮助你更容易地发现问题。
我不确定你在问什么。您遇到错误,因为您正试图访问a的索引-1。数组从0开始。值-1不存在。userid
应介于0和a.Length之间。
您的方法是否应该接受低于零的userid
值?如果是这样,则不能使用它来定义数组的长度。时期
如果-1不是一个有效值,我会在dotproduct
方法的第一行添加这个值,因为它是公共的:
if (userid < 0) throw new ArgumentOutOfRangeException("userid");
至于为什么在当前上下文中是-1,正如其他人指出的那样,如果您试图在d
数组中找到的文本值不存在,IndexOf
方法将返回-1。在调用方法之前,您必须验证用户的输入。
我还会说我在另一篇文章中已经告诉过你的:以清晰的方式命名变量,如果这在你的场景中有意义,那么就使用自定义类而不是锯齿状数组。您的代码将更易于阅读和维护。
int userseq=Array.IndexOf(d, sc);
如果项CCD_ 13不存在于数组CCD_。然后将userseq
变量作为函数dotproduct
的第一个参数传递,并根据其第一个参数(userid
(获取数组索引。这就是你的问题——在IndexOf
中。
我不知道如何修复它——这是您的构建逻辑,当数组中不存在输入数据时,您必须决定如何处理这种情况。可能会立即向用户显示消息。