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
相关产品推荐
相关产品推荐

