从SortedSet中删除对象

时间:2014-11-13 00:49:25

标签: c# algorithm oop sorting sortedset

我已经看了很长时间,希望有人可以提供帮助。

一般的jist是;

  1. 我有一个玩家对象的SortedSet(按Y位置排序),每个玩家都包含一个<多边形'的排序集。对象又包含三个点对象的列表,显然形成一个三角形。

  2. 此多边形集按所述多边形的面积排序,从最小到最大。

  3. 我想做的是遍历一组玩家;

  4. 予。将索引[1]处的点(三角形的“峰值”)从多边形SortedSet中的第一个对象分配给播放器内的另一个变量。

    II。一旦索引[1]上的点被分配给一个玩家,我需要遍历每个玩家并删除包含ElementAt(1)当前点的多边形的任何实例,这样就没有父母的后续玩家& #39;可以为迭代分配包含该点的多边形。

    可能需要注意的是,polygonPoints [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,它的确如你所期望的那样。

    编辑 - 对于发现此问题寻找类似问题解决方案的人,不要浪费时间使用排序集对对象集合进行排序,您可以使用OrderBy来实现列表也一样。

1 个答案:

答案 0 :(得分:0)

这是一个远景,但有时比较浮点数和双精度因精确而有点棘手。例如,由于舍入误差,点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相等运算符会处理它,但它可能不是