【问题标题】:How to get reference to a rectangle from List [duplicate]如何从列表中获取对矩形的引用[重复]
【发布时间】:2019-02-12 19:01:10
【问题描述】:

我想从列表中获取指向矩形的指针。但是 Rectangle 是结构,当我尝试获取指针时,我得到了副本。

Class MyClass
{
    Rectangle MovingRectangle;
    List<Rectangle> RectangleList;
    Point StartLocation;

    ***some code here***

    void PicBoxMouseDown(object sender, MouseEventArgs e)
    {
        foreach (rectangle in RectangleList)
        {
            if (condition) 
            {
                MovingRectangle = rectangle;
                StartLocation = e.Location;
                break;
            }
        }
    }

    void PicBoxMouseMove(object sender, MouseEventArgs e)
    {
        MovingRectangle.Location =
                new Point(movingRectangle.Location.X + (e.X - StartLocation.X),
                          movingRectangle.Location.Y + (e.Y - StartLocation.Y));
    }

}

我想更改列表中的矩形位置,但我更改了副本的位置。

【问题讨论】:

  • 我没有在代码中看到您“更改列表中的矩形位置”。但是,您更改列表中矩形位置的方法是将其从旧位置中删除并将其插入新位置。复制一个矩形(这就是它所需要的)并不比复制一个引用(如果 Rectangle 是一个类而不是一个结构,你会做什么)做更多的工作
  • 您可以并且可能应该使用rectanlge 和代码中已有的一些其他字段创建一个类。永远为成长做计划!

标签: c# list struct


【解决方案1】:

不是存储矩形的副本,而是存储矩形的索引,然后重新分配整个矩形。

int MovingRectangleIndex;
List<Rectangle> RectangleList;
Point StartLocation;

void PicBoxMouseDown(object sender, MouseEventArgs e)
{
    for (int i = 0; i < RectangleList.Count; i++) {
        if (condition) {
            MovingRectangleIndex = i;
            StartLocation = e.Location;
            break;
        }
    }
}

void PicBoxMouseMove(object sender, MouseEventArgs e)
{
    var rect = RectangleList[MovingRectangleIndex];
    RectangleList[MovingRectangleIndex] = new Rectangle(
        rect.X + e.X - StartLocation.X,
        rect.Y + e.Y - StartLocation.Y,
        rect.Width, rect.Height);
}

这是更改列表中结构属性的唯一方法。但是,可以更改结构数组中元素的属性。不同之处在于列表有一个索引器(即一对 get 和 set 方法),其中 get 方法返回元素的副本,而数组有一个真正的索引。即,索引数组返回数组内的位置。数组是 C# 编译器支持的基本类型。列表作为库中的普通类实现。 C# 编译器没有特定的列表知识。

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2017-11-26
    • 2020-04-01
    • 2015-07-11
    相关资源
    最近更新 更多