为什么数组会覆盖它以前的值

时间:2015-03-02 09:51:28

标签: c# arrays

rozpoznajD,O,M是双[1],里面有一个双。

progD,O,M是常数atm(0.5)。

在foreach循环之前

int i = 0

在循环之前声明的一些其他变量:

double[] rozpoznajD, rozpoznajO, rozpoznajM;
trzysiecitab[] valid = new trzysiecitab[ileObrazkow * 3];
double[] progD, progO, progM;
progD = new double[] { 0.5 };
progO = new double[] { 0.5 };
progM = new double[] { 0.5 };
rozpoznajD = new double[1];
rozpoznajO = new double[1];
rozpoznajM = new double[1];

问题是,在每个步骤(每个文件名)中,数组有效地覆盖它的先前值。为什么会这样?

换句话说:循环结束后,每个字段都有最后一个文件名的值。

以下是代码:

foreach(string filename in files) {
    bmp1 = new Bitmap(Image.FromFile(filename));
    rozpoznajD = ssn1.policzWyjscia(Pomocnicze.binaryzacja(bmp1));
    rozpoznajO = ssn2.policzWyjscia(Pomocnicze.binaryzacja(bmp1));
    rozpoznajM = ssn3.policzWyjscia(Pomocnicze.binaryzacja(bmp1));
    if (filename.EndsWith("d.bmp")) {
        if (rozpoznajD[0] > progD[0]) valid[i] = new trzysiecitab(rozpoznajM, 1, 'd');
        else valid[i] = new trzysiecitab(rozpoznajM, 0, 'd');
        if (rozpoznajO[0] < progO[0]) valid[i + 1] = new trzysiecitab(rozpoznajO, 1, 'o');
        else valid[i + 1] = new trzysiecitab(rozpoznajO, 0, 'o');
        if (rozpoznajM[0] < progM[0]) valid[i + 2] = new trzysiecitab(rozpoznajM, 1, 'm');
        else valid[i + 2] = new trzysiecitab(rozpoznajM, 0, 'm');
        i += 3;
    } else if (filename.EndsWith("o.bmp")) {
        if (rozpoznajD[0] < progD[0]) valid[i] = new trzysiecitab(rozpoznajM, 1, 'd');
        else valid[i] = new trzysiecitab(rozpoznajM, 0, 'd');
        if (rozpoznajO[0] > progO[0]) valid[i + 1] = new trzysiecitab(rozpoznajO, 1, 'o');
        else valid[i + 1] = new trzysiecitab(rozpoznajO, 0, 'o');
        if (rozpoznajM[0] < progM[0]) valid[i + 2] = new trzysiecitab(rozpoznajM, 1, 'm');
        else valid[i + 2] = new trzysiecitab(rozpoznajM, 0, 'm');
        i += 3;
    } else if (filename.EndsWith("m.bmp")) {
        if (rozpoznajD[0] < progD[0]) valid[i] = new trzysiecitab(rozpoznajM, 1, 'd');
        else valid[i] = new trzysiecitab(rozpoznajM, 0, 'd');
        if (rozpoznajO[0] < progO[0]) valid[i + 1] = new trzysiecitab(rozpoznajO, 1, 'o');
        else valid[i + 1] = new trzysiecitab(rozpoznajO, 0, 'o');
        if (rozpoznajM[0] > progM[0]) valid[i + 2] = new trzysiecitab(rozpoznajM, 1, 'm');
        else valid[i + 2] = new trzysiecitab(rozpoznajM, 0, 'm');
        i += 3;
    }
}

2 个答案:

答案 0 :(得分:0)

每次在foreach循环中都需要重新创建对象rozpoznajD / O / M.由于对象引用由数组元素保存。

因为,数组元素持有对象引用,所以在每次迭代之后,rozpoznajD / O / M对象都会使用新的对象引用进行更新。所有这些都开始指向新对象。

您需要执行以下操作:

var rozpoznajD = ssn1.policzWyjscia(Pomocnicze.binaryzacja(bmp1));
var rozpoznajO = ssn2.policzWyjscia(Pomocnicze.binaryzacja(bmp1));
var rozpoznajM = ssn3.policzWyjscia(Pomocnicze.binaryzacja(bmp1));

查看问题here的答案,了解值类型和引用类型之间的区别。

答案 1 :(得分:0)

我通过编辑trzysiecitab类来接受double而不是double[]作为参数来解决问题,并按照以下方式创建它:

valid[i] = new trzysiecitab(rozpoznajD[0], 1, 'd');