Split - Index超出了数组的范围

时间:2012-11-27 09:34:18

标签: c# split

我使用以下代码拆分字符串并存储它:

string[] proxyAdrs = linesProxy[i].Split(':');
string proxyServer = proxyAdrs[0];
int proxyPort = Convert.ToInt32(proxyAdrs[1]);


if(proxyAdrs[2] != null)
{
    item.Username = proxyAdrs[2];
}

if (proxyAdrs[3] != null)
{
    item.Password = proxyAdrs[3];
}

问题是我得到了

  

索引超出了数组的范围。

proxyAdrs[2]不存在时。

有时候,proxyAdrs [2]会在那里。

我该如何解决这个问题?

7 个答案:

答案 0 :(得分:8)

只需检查if语句中返回的数组的长度

if( proxyAdrs.Length > 2 &&  proxyAdrs[2] != null)
    {
        item.Username = proxyAdrs[2];
    }

您获得异常的原因是split会返回大小小于您正在访问的索引的数组。如果您正在访问数组元素2,那么数组中必须有至少3元素,因为数组索引以0开头

答案 1 :(得分:2)

您可以在通过索引访问其元素之前检查数组的长度。

更改

   if(proxyAdrs[2] != null)
   {
            item.Username = proxyAdrs[2];
   }

   if(proxyAdrs.Length > 2 )
   {
            item.Username = proxyAdrs[2];
   }

答案 2 :(得分:0)

试试这个:

        string[] proxyAdrs = linesProxy[i].Split(':');
        string proxyServer = proxyAdrs[0];
        int proxyPort = Convert.ToInt32(proxyAdrs[1]);


        if(proxyAdrs.Length > 2 && proxyAdrs[2] != null)
        {
            item.Username = proxyAdrs[2];
        }

        if (proxyAdrs.Length > 3 && proxyAdrs[3] != null)
        {
            item.Password = proxyAdrs[3];
        }

答案 3 :(得分:0)

在尝试下标可能不存在的项目之前检查proxyAdrs的长度。

if ( proxyAdrs.Length > 1 ) {
  item.Username = proxyAdrs[2];
}

答案 4 :(得分:0)

您的i可能低于您尝试设置为2的索引:)

if i >= 2然后你可以完成以下所有操作:----

if(proxyAdrs[2] != null)
        {
            item.Username = proxyAdrs[2];
        }

        if (proxyAdrs[3] != null)
        {
            item.Password = proxyAdrs[3];
        }
}
else I suggest you get out :D

但同样,检查proxyAdrs.Lenght将是最好的。

答案 5 :(得分:0)

根据您是否形成传入数据(变量linesProxy),有两个选项可以帮助您:

  1. 如果确实形成了传入数据:始终包含字符串的所有部分。在您的情况下,如果没有提供第二个值,请始终通过在第一个和第三个值之间添加额外的proxyAdrs[3]来确保您有4个(假设:是最后一个)部分。因此,在.Split()操作后(确保您未激活RemoveEmptyStrings选项),您的proxyAdrs[2]将为null,您的样本将会很好。
  2. 否则:如果proxyAdrs[2]是唯一可以为空的部分,则可以防止崩溃:

    string[] proxyAdrs = linesProxy[i].Split(':');
    string proxyServer = proxyAdrs[0];
    int proxyPort = Convert.ToInt32(proxyAdrs[1]);    
    
    if(proxyAdrs.Length > 3)
    {
      if(proxyAdrs[2] != null)
          item.Username = proxyAdrs[2];
      if (proxyAdrs[3] != null)
          item.Password = proxyAdrs[3];
    }
    else
    {
     if(proxyAdrs[2] != null)
          item.Password = proxyAdrs[2];
    }
    

答案 6 :(得分:0)

try
{
    objCommonDD = new CommonDropDownBLL();
    objCommonDDEntity = new CommonDropdownEntity();

    //string strState=contextKey.ToString();
    string[] contextKeySplit = contextKey.Split('^');
    string strState = contextKeySplit[0].ToString();
    string strPin = contextKeySplit[1].ToString();

    objCommonDDEntity.TableName = "PCOM_PINCODES";
    objCommonDDEntity.DeleteField = "";
    objCommonDDEntity.TextField = "RTRIM(PIN_CITY_NAME) AS PC_DESC";
    objCommonDDEntity.ValueField = "DISTINCT PIN_CITY_CODE AS PC_CODE";

    objCommonDDEntity.StrCondition = " AND PIN_COUNTRY_CODE='IND' AND UPPER(PIN_CITY_NAME) LIKE UPPER('" + prefixText + "%') AND PIN_STATE_NAME='" + strState + "' AND PIN_CODE='" + strPin + "' ORDER BY PC_DESC";

    DataTable dtCity = new DataTable();
    dtCity = objCommonDD.GetData(objCommonDDEntity);

    string[] items = new string[dtCity.Rows.Count];
    int i = 0;

    for (i = 0; i < dtCity.Rows.Count; i++)
    {
        items.SetValue(dtCity.Rows[i]["PC_DESC"].ToString(), i);
    }

    return items;
}