2016-03-03 68 views
0

我的C#程序有问题。我想为我的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是数据列表。在我的代码结束时,我计算并分配了一个[0] [0],一个[0] [1]和一个[0] [2]。但是,当程序到达[1] [0],[1] [1]和[1] [2]和...旧值(包括[0] [0],a [0] [1]和a [0] [2]自动改变。有什么问题,我该如何解决它?

谢谢。

+4

不能说我是你的命名约定的粉丝... – LarsTech

+0

你将相同的列表引用('u3')添加到'a'中3次。 – juharr

回答

2
 a.Add(u3); 

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

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

3

问题是这样的

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); 
相关问题