2

当我从列表中访问点时,我在设置点的 Y 坐标时遇到了一些问题。

例如,这有效。

System.Windows.Point test = new System.Windows.Point(6,5);
test.Y = 6;

但是,如果我有一个点列表并且我通过列表访问一个点来设置 Y 坐标,我会收到一个错误。

List<System.Windows.Point> bfunction = new List<System.Windows.Point>();
bfunction.Add(new System.Windows.Point(0, 1));
bfunction[0].Y = 6;

bfunction[0] 带有下划线,并给我一个错误“无法修改 'System.Collections.Generic.List.this[int]' 的返回值,因为它不是变量。”

任何帮助,将不胜感激。

4

2 回答 2

5

基本上,编译器会阻止你犯错。当您访问时bfunction[0],将返回该点的副本Point不幸的是(IMO)是一个可变结构。因此,如果编译器允许您更改副本,那么该副本将被丢弃,并且该语句将毫无意义。相反,您需要使用一个变量来获取副本,在此处进行更改,然后将其放回列表中:

Point point = bfunction[0];
point.Y = 6;
bfunction[0] = point;

如果是引用类型,这将不是必需的,如果是不可变值类型Point,您将没有机会犯错误。您仍然需要单独获取和设置,但它会是这样的:Point

bfunction[0] = bfunction[0].WithY(6);

... whereWithY将返回一个与原始值Point相同X但指定的值Y

于 2013-04-25T19:10:16.977 回答
0

我也遇到了同样的问题,谢谢你的回复。

这是我的解决方案:

if (reset == false && run == true)

{
  for ( int i = 0;i < locations.Count;i++)

  {
    double stepX = rnd.Next(-1, 2) * 5 * rnd.NextDouble();
    double stepY = rnd.Next(-1, 2) * 5 * rnd.NextDouble();
    double stepZ = rnd.Next(-1, 2) * 5 * rnd.NextDouble();
    Vector3d transform = new Vector3d(stepX, stepY, stepZ);

    locations[i] += transform;

    // Constrain points to boundary conditions

    Point3d ptx = locations[i]; // make temp variable to hold all points
    ptx.X = CV.Constrain(ptx.X, 0, bX - 1); // access X coordinates and modify them
    locations[i] = ptx; // assign new X coordinates to points in List

    Point3d pty = locations[i];
    pty.Y = CV.Constrain(pty.Y, 0, bY - 1);
    locations[i] = pty;

    Point3d ptz = locations[i];
    ptz.Z = CV.Constrain(ptz.Z, 0, bZ - 1);
    locations[i] = ptz;





    Component.ExpireSolution(true);

  }

}
于 2017-08-19T03:22:03.380 回答