使用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显示为唯一:
如果我随后获得了枚举数并使用以下代码:
Coordinate[] coords = new Coordinate[] { };
var en = tree.GetEnumerator();
while (en.MoveNext())
{
Console.WriteLine(en.Current.Value.X);
}
我得到:
5
5
5
在我看来,我实际上是在存储对数据的引用,并且数据是单个对象。现在的难题是,编译器在断点处显示错误的值是什么?
答案 0 :(得分:0)
我假设Vec
是PointStatus
类的一个属性。类是引用类型。
您要添加一次创建的Coordinate point
, ,对于3个不同的温度值,将创建3次。点参考保持不变。
如果您在某个位置进行更改,则该更改会在所有地方反映出来,因为您直接在对象中进行更改。它不同于值类型的副本。
预期结果。
编辑:
调试器正在显示temp的值,它是一个双精度数组。那只是树列表内每个对象中的少数几个属性值的集合。
如果您分别展开项目0、1和2,则会看到完整的信息。
Coordinate point
将返回一次创建的Coordinate类对象的属性之一的值。