0

アプリケーションを実行しようとすると、Index was outside the bounds of the arrayアット行が表示されfloat[] u_f = a[userid]; ます PS。ユーザーIDはすべての整数にすることができますが、(アイテムの場合は0、1143600)から(ユーザーの場合は0、89395)の間の整数のインデックスを取得し、計算はそれに基づいています。のuserid値に基づいていない配列 a に格納されている値のインデックス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);
            }
4

3 に答える 3

0

明らかに と等しいかそれ以上の値でdotproduct呼び出されます。userida.Length

それが起こらない場合は、u_f配列を宣言する前に次の行を追加します。

Debug.Assert(a.Length > userid);

もちろん、これ自体で問題が解決するわけではありませんが、テスト中にそのような状況が発生した場合に、見過ごされたり飲み込まれたりすることはありません。

補足として、変数名をより明確にすると、コードを読みやすくなり、問題を把握しやすくなります。可能であれば、ジャグ配列の代わりに実際の型を使用することも役立つでしょう。

于 2014-03-21T15:13:55.827 に答える
0

userIDの値が配列の最大インデックス番号より大きいことを意味しますa。最大インデックスは count - 1 です。

エラーメッセージはそれについて言及しています。

aまた、二次元のように見えます。これはあなたの問題でしょうか?

于 2014-03-21T15:14:00.653 に答える
0

replace a[userid] with

 a[userid-1]
于 2014-03-21T15:24:14.023 に答える