为什么列表成员在 C# 中意外更改

本文关键字:意外 列表 成员 为什么 | 更新日期: 2023-09-27 18:37:12

我的C#程序有问题。我想将一些值分配给 3*3 矩阵,该矩阵是 C# 代码中的二维列表。这是我代码的一部分:

        List<double> coefs = new List<double>();
        List<List<double>> a = new List<List<double>>();
        List<double> b = new List<double>();
        List<double> u3 = new List<double>();
        List<double> x2 = new List<double>();
        List<double> x3 = new List<double>();
        List<double> x4 = new List<double>();
        List<double> xy = new List<double>();
        List<double> x2y = new List<double>();

        for (int i=0;i<3;++i)
            u3.add(0);
        for (int i = 0; i < 3; ++i)
        {
            a.Add(u3);
            b.Add(0);
        }
            for (int i = 0; i < n; ++i)
            {
                x2.Add(Math.Pow(x[i], 2));
                x3.Add(Math.Pow(x[i], 3));
                x4.Add(Math.Pow(x[i], 4));
                xy.Add(x[i] * y[i]);
                x2y.Add(Math.Pow(x[i], 2) * y[i]);
            }
        a[0][0] = n;
        a[0][1] = sum(x, n);
        a[0][2] = sum(x2, n);
        a[1][0] = a[0][1];
        a[1][1] = a[0][2];
        a[1][2] = sum(x3, n);
        a[2][0] = a[0][2];
        a[2][1] = a[1][2];
        a[2][2] = sum(x4, n);
        b[0] = sum(y, n);
        b[1] = sum(xy, n);
        b[2] = sum(x2y, n);

x 和 y 是数据列表。在我的代码结束时,我计算并分配 a[0][0]、a[0][1] 和 a[0][2]。但是吃了下一个命令,当程序到达a[1][0],a[1][1]和a[1][2]和...时,包括a[0][0],a[0][1]和a[0][2]在内的旧值会自动更改。问题是什么,我该如何解决?

谢谢。

为什么列表成员在 C# 中意外更改

问题是这个

    List<double> u3 = new List<double>();
    for (int i=0;i<3;++i)
        u3.add(0);
    for (int i = 0; i < 3; ++i)
    {
        a.Add(u3);
        b.Add(0);
    }

您添加u3 3 次,这意味着 a[0]a[1] a[2]都指向同一个列表。如果修改a[0]则对 a[1]a[2] 执行相同的更改。

您需要为每个元素创建一个新列表

    for (int i = 0; i < 3; ++i)
    {
        List<double> u3 = new List<double>();
        for (int j=0;j<3;++j)
            u3.add(0);
        a.Add(u3);
        b.Add(0);
    }

但是,看起来您只是在处理固定大小的列表,如果您只使用数组而不是列表,则可以简化初始化代码

    List<double> coefs = new List<double>();
    double[,] a = new double[3,3];
    double[] b = new double[3];
    List<double> x2 = new List<double>();
    List<double> x3 = new List<double>();
    List<double> x4 = new List<double>();
    List<double> xy = new List<double>();
    List<double> x2y = new List<double>();
        for (int i = 0; i < n; ++i)
        {
            x2.Add(Math.Pow(x[i], 2));
            x3.Add(Math.Pow(x[i], 3));
            x4.Add(Math.Pow(x[i], 4));
            xy.Add(x[i] * y[i]);
            x2y.Add(Math.Pow(x[i], 2) * y[i]);
        }
    a[0,0] = n;
    a[0,1] = sum(x, n);
    a[0,2] = sum(x2, n);
    a[1,0] = a[0,1];
    a[1,1] = a[0,2];
    a[1,2] = sum(x3, n);
    a[2,0] = a[0,2];
    a[2,1] = a[1,2];
    a[2,2] = sum(x4, n);
    b[0] = sum(y, n);
    b[1] = sum(xy, n);
    b[2] = sum(x2y, n);
        a.Add(u3);

您刚刚添加了a中的所有三个项目相同的内部列表。

您需要在每次迭代中添加一个单独的List<double>实例。