从排序集中删除对象
本文关键字:对象 删除 集中 排序 | 更新日期: 2023-09-27 18:30:15
我已经看了太久了,希望有人能帮忙。
一般的jist是;
-
我有一个玩家对象的 SortedSet (按 Y 位置排序),每个玩家都包含一个排序的"多边形"对象集,这些对象又包含三个点对象的列表,显然形成了一个三角形。
-
该多边形集按所述多边形的面积从小到大排序。
-
我想做的是遍历一组玩家和;
I. 将多边形 SortedSet 中第一个对象的索引 [1](三角形的"峰值")处的点分配给玩家内部的另一个变量。
II. 一旦将索引 [1] 处的点分配给玩家,我需要遍历每个玩家并删除包含 ElementAt(1) 处当前点的多边形的任何实例,以便"父"迭代中的后续玩家无法被分配包含该点的多边形。
需要注意的是,多边形点[1]的点是基于敌人的位置,因此它们在所有玩家中都是一致的,这就是为什么我试图使用它作为我的"参考"点来删除任何包含该点的多边形对象。
这是一个复杂的解释,但希望你能够遵循。
现在我已经让第一部分工作了,但第二部分被证明是一个严重的痛苦 - 我尝试了删除和删除位置(使用应该删除所有内容的标准),并且无论我做什么,集合都会顽固地保持相同的长度。
作为参考,这是我正在争论的最新版本的代码。
List<PointF> duplicates = new List<PointF>();
foreach (Player p in playerSet)
{
//Assign lowest cost polygon to current player, then remove all polygons containing the point at p.triangleSet.ElementAt(0).polygonPoints[1] from every other player so it can't be assigned to any subsequent player.
p.currentAttackingPoint = p.triangleSet.ElementAt(0).polygonPoints[1];
//I use this method to keep track of which 'attacking points' have been assigned.
add(p.currentAttackingPoint);
//Then, in theory, I use this method to remove all polygons that contain any point in the duplicates list from every other player. Obviously this is proving to be the troublesome aspect.
remove(duplicates);
}
...
private void add(PointF i)
{
duplicates.Add(i);
}
private void remove(List<PointF> dupes)
{
foreach(PointF p in dupes)
{
foreach (Player l in playerSet)
{
//Outputs 100
textBox3.AppendText(l.triangleSet.Count.ToString() + "'r'n");
l.triangleSet.RemoveWhere(e => e.polygonPoints[1] == p);
//l.pressingTriangleSet.RemoveWhere(e => e.polygonPoints[1].X > 0); --Doesn't work either, despite it being true of every point in the set.
//Still 100
textBox3.AppendText(l.triangleSet.Count.ToString() + "'r'n");
}
}
}
请记住,每个玩家内部的多边形集,虽然长度相同,但内容大不相同,但它们基于玩家的位置、敌人的位置以及关于游戏状态的另一个任意事实 - 所以我不能只是从每个玩家的集合中删除第一个多边形。
我正在考虑在创建后将每个集合转换为列表,因为这很奇怪,它一定是我忽略的一些操作顺序问题。
纯粹是为了我自己的理智,我把它 http://pastie.org/private/ikq5lhhacxxvfaoervauw 淘汰了,它完全按照你的期望工作。
编辑 - 对于任何发现这一点寻找类似问题解决方案的人,不要浪费时间使用 sortedsets 对对象集合进行排序,您可以使用 OrderBy 通过列表实现相同的目标。
这是一个远景,但有时比较浮点数和双精度有点棘手,因为精度。例如,由于舍入误差,点 1.0 可能表示为 1.0000001。您的积分可能没有正确比较
尝试类似的东西
e.polygonPoints[1].X - p.X < 0.00001
&& p.X - e.polygonPoints[1].X < 0.00001
&& e.polygonPoints[1].Y - p.Y < 0.00001
&& p.Y - e.polygonPoints[1].Y < 0.00001
我本以为 PointF 相等运算符会处理这个问题,但它可能不会