Индекс находился за пределами массива
Когда я пытаюсь запустить приложение, он показывает Index was outside the bounds of the array
на линии float[] u_f = a[userid];
Любая идея?
PS. идентификатор пользователя может быть любым целым числом, но я беру индекс целого числа с (между 0, 1143600 для элемента) и (0, 89395 для пользователя), и мои вычисления основаны на этом. Затем мои вычисления основаны на индекс 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);
}
3 ответа
Это означает ценность userID
больше максимального номера индекса массива a
, Максимальный индекс считается - 1.
В сообщении об ошибке упоминается об этом.
Кроме того, это выглядит как a
является двухмерным. Может ли это быть вашей проблемой?
Очевидно dotproduct
вызывается с userid
значение равно или больше, чем a.Length
,
Если этого не произойдет, добавьте эту строку перед объявлением u_f
массив:
Debug.Assert(a.Length > userid);
Конечно, это не решит проблему само по себе, но гарантирует, что когда такая ситуация возникнет во время тестирования, она не останется незамеченной или проглоченной.
Как примечание, более ясные имена переменных облегчили бы вам чтение вашего кода и выяснение проблем. Использование реальных типов вместо зубчатых массивов, вероятно, также поможет, если это возможно.