-1

使用 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# 新手,仍在学习。这里可能发生什么。

这是GetEnumerator 上文档的链接。

编辑:当我使用相同的 temp 实例然后添加断点时,值显示为唯一: 在此处输入图像描述

如果我然后获取枚举器并使用以下代码:

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

我得到:

5

5

5

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

4

1 回答 1

0

我认为这PointStatusCoordinate point类的属性。类是引用类型。

您正在为 3 个不同的温度值添加 3 次Coordinate point创建一次。点参考保持不变。

如果您在一个地方进行更改,它会在各处反映出来,因为您直接在对象中进行更改。它不像值类型的副本。

你得到的结果是预期的。

编辑:

调试器显示 temp 的值,它是一个双数组。这只是树列表中每个对象中属性的几个值的集合。

如果您将展开每个项目 0、1 和 2,您将看到完整的信息。

Current.Value.X将返回创建一次的 Coordinate 类对象的属性之一的值。

于 2018-10-01T08:00:44.327 回答