You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Point类位置能否更新?粒子Point字段周边整数点添加列表语法求助

解决Point坐标便捷累加的问题

嗨,我完全懂你的痛点——不想每次都重复写particle.Point.X + i、particle.Point.Y + j这种繁琐的代码,想找类似ps += (i,j)一样简洁的写法对吧?下面给你几个实用的方案:

方案1:给Point加扩展方法/重载运算符

你可以给Point类写个扩展方法,或者直接重载+运算符,让它支持和元组的加法操作,这样就能像数值运算一样简洁:

// 扩展方法类,放在合适的命名空间下
public static class PointHelper
{
    // 重载+运算符,支持Point加(int, int)元组
    public static Point operator +(Point original, (int dx, int dy) offset)
    {
        return new Point(original.X + offset.dx, original.Y + offset.dy);
    }

    // 也可以写个Add方法,适合不习惯运算符重载的场景
    public static Point Add(this Point original, int dx, int dy)
    {
        return new Point(original.X + dx, original.Y + dy);
    }
}

之后你就能这么写了:

// 用运算符重载的方式
ps.Add(particle.Point + (i, j));

// 或者用Add扩展方法
ps.Add(particle.Point.Add(i, j));

方案2:用元组解构简化代码

如果不想额外写扩展类,也可以用元组解构把Point的X、Y拆出来,减少重复代码:

// 先解构粒子的Point坐标
var (baseX, baseY) = particle.Point;

// 循环生成正方形点的时候直接用
foreach (int i in ...) // 这里替换成你的正方形范围循环
{
    foreach (int j in ...)
    {
        var newPoint = new Point(baseX + i, baseY + j);
        if (!getstuck.Contains(newPoint))
        {
            ps.Add(newPoint);
        }
    }
}

方案3:批量生成+过滤(.NET 6+适用)

如果你的项目用的是.NET 6及以上版本,还可以用LINQ批量生成正方形的所有点,再过滤掉已在getstuck里的,一次性加到列表里,代码更简洁高效:

var (baseX, baseY) = particle.Point;
int squareSize = 1; // 这里替换成你的正方形边长半值,比如1就是3x3的正方形

// 生成正方形范围内的所有整数坐标点
var newPoints = Enumerable.Range(-squareSize, squareSize * 2 + 1)
    .SelectMany(dx => Enumerable.Range(-squareSize, squareSize * 2 + 1)
        .Select(dy => new Point(baseX + dx, baseY + dy)))
    .Where(point => !getstuck.Contains(point));

// 批量添加到ps列表
ps.AddRange(newPoints);

需要注意的是,Point是值类型,上面所有方法生成的都是新的Point实例,不会修改原粒子的Point字段,完全符合你的需求~

内容的提问来源于stack exchange,提问作者armara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:29:02