C#使用枚举器更改基础数据的值

时间:2018-10-01 00:13:59

标签: c# accord.net

使用Accord.net KD树库。我有以下代码:

        Accord.Collections.KDTree<Coordinate> tree = new Accord.Collections.KDTree<Coordinate>(3);
        Coordinate point = new Coordinate(5, 5, 5);
        double[] temp = { 5, 5, 5 };
        tree.Add(temp, point);
        temp = new double[] { 1,1,1 };
        tree.Add(temp, point);
        temp = new double[] { 6,6,6 };
        tree.Add(temp, point);

        var en = tree.GetEnumerator();
        while (en.MoveNext())
        {
            en.Current.Value.PointStatus = 99;
        }
    }

树中有三个值-索引0,1,2。当while循环在第一次迭代的代码底部运行时,我希望只有当前(第一个)实体的值更改为99。相反,所有三个实体都更改为99。

C#的新手,仍在学习中。这里可能会发生什么。

Here is a link到GetEnumerator上的文档。

编辑: 当我使用相同的temp实例,然后添加一个断点时,vaules显示为唯一: enter image description here

如果我随后获得了枚举数并使用以下代码:

Coordinate[] coords = new Coordinate[] { };
var en = tree.GetEnumerator();
while (en.MoveNext())
{
    Console.WriteLine(en.Current.Value.X);
}

我得到:

  

5

     

5

     

5

在我看来,我实际上是在存储对数据的引用,并且数据是单个对象。现在的难题是,编译器在断点处显示错误的值是什么?

1 个答案:

答案 0 :(得分:0)

我假设VecPointStatus类的一个属性。类是引用类型。

您要添加一次创建的Coordinate point ,对于3个不同的温度值,将创建3次。点参考保持不变。

如果您在某个位置进行更改,则该更改会在所有地方反映出来,因为您直接在对象中进行更改。它不同于值类型的副本。

预期结果。

编辑:

调试器正在显示temp的值,它是一个双精度数组。那只是树列表内每个对象中的少数几个属性值的集合。

如果您分别展开项目0、1和2,则会看到完整的信息。

Coordinate point将返回一次创建的Coordinate类对象的属性之一的值。