“输入字符串格式不正确”错误

时间:2014-02-21 14:34:17

标签: c#

以下脚本显示

  

“索引超出了数组的范围”

在第

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);
                }
            }
        }

4 个答案:

答案 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检查TextBoxTextBox1.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链接,如果您需要更多阅读,它还有更多链接。

希望这可以帮助那些对“输入字符串格式不正确”的人感到困惑,因为他们的字符串中没有整数,就像我刚才的经历一样。