得到错误' System.IndexOutOfRangeException'

时间:2016-11-04 10:20:34

标签: c#

public float[] HitungFitness()
{
    float[] fitness = new float[populasi];
    for (var individu = 0; individu < populasi; individu++)
    {
        fitness[individu] = CekConstraint(individu);
    }
    string[] sort = new string[populasi];
    for (int i = 0; i < populasi; i++)
    {
        sort[i] = string.Format("\nIndividu {0} :Fitness {1}",(i + 1), fitness[i]);
    }
        bool swapped = true;
        while (swapped)
        {
            swapped = false;
            for (int i = 0; i < populasi-1 ; i++)
            {
                string[] strI = sort[i].Split('.');
                float fitI = float.Parse(string.Format("0.{0}", strI[1]));

                string[] strJ = sort[i + 1].Split('.');
                float fitJ = float.Parse(string.Format("0.{0}", strJ[1]));

                if (fitI < fitJ)
                {
                    string sTmp = sort[i];
                    sort[i] = sort[i + 1];
                    sort[i + 1] = sTmp;
                    swapped = true;
                }
            }
        }
    return fitness;
}

变量populasi assign = 12

函数CekConstraint在&#39; 0之间给出一个返回值。***&#39;到&#39; 1&#39;

我遇到了问题:

float fitI = float.Parse(string.Format("0.{0}", strI[1]));

float fitJ = float.Parse(string.Format("0.{0}", strI[1]));

strIstrJ只给出strJ[1]stri[1]等数组的一个值时,我得到的索引是数组的超出范围。我认识到错误,但我该如何解决这个问题?

请帮帮我。

3 个答案:

答案 0 :(得分:2)

string[] strI = sort[i].Split('.');
float fitI = float.Parse(string.Format("0.{0}", strI[1]));

sort[i]字符串中没有.。因此,当您调用Split('.')时,您只生成包含1个项目的数组。由于你收到strI[1]并且异常,strI数组中没有第二个元素。

答案 1 :(得分:0)

错误是因为它未在strI[1]strJ[1]中获得价值。由于在"."中找不到sort[i],可能会发生这种情况。因此,我们可以看到基于strIstrJ数组长度的条件。

将内部for循环更改为

for (int i = 0; i < populasi-1 ; i++)
{
    float fitI = 0.0;
    float fitJ = 0.0;
    string[] strI = sort[i].Split('.');
    if(strI.Length > 1)
        fitI = float.Parse(string.Format("0.{0}", strI[1]));


    string[] strJ = sort[i + 1].Split('.');

    if(strJ.Length > 1)
        fitJ = float.Parse(string.Format("0.{0}", strJ[1]));


    if (fitI < fitJ)
    {
        string sTmp = sort[i];
        sort[i] = sort[i + 1];
        sort[i + 1] = sTmp;
        swapped = true;
    }
}

答案 2 :(得分:-3)

为什么这么多循环,使用列表或dictinary到位或数组并使用foreach循环来避免超出范围的异常。

float[] fitness = new float[populasi];
//create a list for this

string[] sort = new string[populasi];
//another list 
and do foreach looping