【问题标题】:Split - Index was outside the bounds of the array拆分 - 索引超出了数组的范围
【发布时间】:2012-11-27 09:34:17
【问题描述】:

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

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] 会出现,有时不会出现。

我该如何解决这个问题?

【问题讨论】:

    标签: c# split


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      改变

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

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

      【讨论】:

        【解决方案3】:

        试试这个:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            您的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 是最好的。

            【讨论】:

              【解决方案6】:

              有两个选项可能对您有所帮助,具体取决于您是否形成传入数据(变量linesProxy):

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

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

              【讨论】:

                【解决方案7】:
                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;
                }
                

                【讨论】:

                • 欢迎来到 SO deepika!所以使用答案来问另一个问题是不可接受的。请使用按钮提出新问题。这已被标记为删除。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-04-19
                • 1970-01-01
                • 2015-11-06
                • 2010-11-17
                • 1970-01-01
                相关资源
                最近更新 更多