Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较具有相同字段的两个不同对象列表_C#_Algorithm_Unity3d_Comparison - Fatal编程技术网

C# 比较具有相同字段的两个不同对象列表

C# 比较具有相同字段的两个不同对象列表,c#,algorithm,unity3d,comparison,C#,Algorithm,Unity3d,Comparison,我有一个 class Player { public Vector3 position; public String name; } 和 class Field { public Vector3 position; public bool isTarget; } 我有一个3人的游戏,10个场地和3个目标场地。为了获胜,用户应该将所有玩家放在目标场上。是否有一种比较两个不同对象列表(列表和列表)但具有相同场(位置)的好方法 或者我应该继承球员和场地吗 cla

我有一个

class Player 
{
    public Vector3 position;
     public String name;
}

class Field
{
    public Vector3 position;
    public bool isTarget;
}
我有一个3人的游戏,10个场地和3个目标场地。为了获胜,用户应该将所有玩家放在目标场上。是否有一种比较两个不同对象列表(列表<玩家>和列表<场>)但具有相同场(位置)的好方法

或者我应该继承球员和场地吗

class BaseItem
{
    public Vector3 position;
}

class Player : BaseItem 
{
    public String name;
}
并比较
列表

编辑:只是添加一些澄清:我有一个列表和列表,我想检查是否所有的玩家都与所有isTarget字段具有相同的位置。秩序不重要

var listPlayer = new List<Player>();
listPlayer.Add(new Player { position = new Vector3(1,0,0); name = "a"; }
listPlayer.Add(new Player { position = new Vector3(0,1,0); name = "b"; }
listPlayer.Add(new Player { position = new Vector3(0,0,1); name = "c"; }

var listFields = new List<Field>();
listFields.Add(new Field { position = new Vector3(1,0,0);  isTarget = true;}
listFields.Add(new Field { position = new Vector3(0,1,0);  isTarget = true;}
listFields.Add(new Field { position = new Vector3(0,0,1);  isTarget = true;}
listFields.Add(new Field { position = new Vector3(1,1,0);  }
listFields.Add(new Field { position = new Vector3(1,0,1);  }
****

不确定比较两种不同事物是否是正确的方法。

但是,您可以从基类派生这两件事:

internal class BoardEntity {
    public Vector3 Position { get; set; }
}

internal class Player : BoardEntity {
    public string Name { get; set; }
}

internal class Field : BoardEntity {
    public bool IsTarget { get; set; }
}
现在还有其他事情出现:

  • 你每次都得把它们扔到基础课上,这会让时间变得无聊
  • 比较两件不同的东西是很奇怪的,即使它们拥有相同的财产
  • 不鼓励比较
    浮动
    ,因为结果可能(将)是
代码:

建议:

提供一个
ComparePosition()
方法听起来更自然,因为我们转换为整数,所以比较总是正确的

internal class BoardEntity {
    public Vector3 Position { get; set; }

    public bool ComparePosition(BoardEntity boardEntity) {
        var v1 = new Vector3(boardEntity.Position.X, boardEntity.Position.Y, boardEntity.Position.Z);
        var v2 = new Vector3(Position.X, Position.Y, Position.Z);
        return v1.Equals(v2);
    }
}

internal class MyClass {
    public MyClass() {
        var player = new Player();
        var field = new Field();

        bool comparePosition = player.ComparePosition(field);
    }
}

我不明白。请解释得更清楚些?你能发布一个你想要实现的伪代码吗?同样也不清楚你所说的“但具有相同的字段(位置)”是什么意思?列举球员列表,在列举字段列表中,然后比较球员和字段位置。根据您的需要而有所不同。@SriramSakthivel更新了一个question@LearnCocos2D让我们只关注一个最简单的案例。我想看看如何检查规则“每个玩家都应该有一个对应的字段(istarget==true和field.position==player.position)”是否满足。使用IEquatable和LINQ Intersect。您好,谢谢您的回答。不必担心浮点比较——我说的是更一般的:如何比较不同对象的相似字段。我只是觉得这不是一个天真的解决方案。继承基本对象似乎很好,但也许我可以实现比较的Player.Equals(Field)方法?实际上,你的建议似乎是合理的。
internal class BoardEntity {
    public Vector3 Position { get; set; }

    protected bool Equals(BoardEntity other) {
        return Position.Equals(other.Position);
    }

    public override bool Equals(object obj) {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        var other = obj as BoardEntity;
        return other != null && Equals(other);
    }

    public override int GetHashCode() {
        return Position.GetHashCode();
    }
}

internal class MyClass {
    public MyClass() {
        var player = new Player();
        var field = new Field();

        BoardEntity boardEntity1 = player;
        BoardEntity boardEntity2 = field;
        bool b = boardEntity1.Equals(boardEntity2);
    }
}
internal class BoardEntity {
    public Vector3 Position { get; set; }

    public bool ComparePosition(BoardEntity boardEntity) {
        var v1 = new Vector3(boardEntity.Position.X, boardEntity.Position.Y, boardEntity.Position.Z);
        var v2 = new Vector3(Position.X, Position.Y, Position.Z);
        return v1.Equals(v2);
    }
}

internal class MyClass {
    public MyClass() {
        var player = new Player();
        var field = new Field();

        bool comparePosition = player.ComparePosition(field);
    }
}