比较相同枚举类型的对象的枚举

时间:2018-12-07 08:54:48

标签: c#

我发现了与我要问的问题类似的问题,但不幸的是,这些问题与我要解决的问题不太吻合。

我有多个对象,它们的枚举类型称为TypeOfEnum。

object A = TypeOfEnum.Value1,TypeOfEnum.Value2;
object B = TypeOfEnum.Value2;
object C = TypeOfEnum.Value3,TypeOfEnum.Value2;
object D = TypeOfEnum.Value1,TypeOfEnum.Value4;

我要尝试的是比较这四个对象中两个对象的值,如果它们包含,则任何相同的值(例如A和D,但不包括D和B)继续通过代码。如果不是,则跳过结果,并进行新的对象比较。在比较中,它们将始终具有相同的枚举类型,对象将始终包含枚举。

到目前为止,我一直试图将枚举传递给列表,并检查它们是否以字符串而不是整数相交,但是结果却不尽相同。 IE:对象B和对象C将不匹配,但是对象A和C将匹配,而对象D和A将匹配。

我该怎么做?还是不可能?

编辑: 实际的代码直到出现问题的地方: 枚举:

[Flags]
public enum TerrainFlags
{
    None = 0,
    Land = 1,
    Water = 2,
    Air = 4,
    Snow = 8,
    Desert = 16,
    Forest = 32,
    Mountain = 64
}

添加遇到的敌人

private void AddEnemyAndUpdatePoints(List<Enemy> enemyList, Enemy enemy, ref int points, ref int bonusMoney, Village village)
    {
        List<string> terrainVillages = new List<string>();
        List<string> terrainEnemies = new List<string>();
        terrainVillages.Add(Enum.GetName(typeof(TerrainFlags), village.Terrain));
        foreach(string terrain in terrainVillages)
            Debug.Log("Village "+village.Name+" "+terrain);
        terrainEnemies.Add(Enum.GetName(typeof(TerrainFlags), enemy.Terrain));
        foreach (string terrain in terrainEnemies)
            Debug.Log("enemy: "+enemy.Name+" "+terrain);
        if (terrainVillages.Intersect(terrainEnemies).Any())
        {
            enemyList.Add(enemy);
            bonusMoney += enemy.Bounty;
            points -= enemy.Points;
            Debug.Log("Enemy Added");
        }
        else
        {
            Debug.Log("Enemy and Village Terrains did not match, rerolling.");
            points -= enemy.Points;
        }

请注意,点-=敌人。else语句中的点只是为了防止此问题引起的无限循环,否则可以忽略。

在以下方法中调用AddEnemyAndUpdatePoints方法:

private int BuyPoints(List<Enemy> enemyList, int points, int difficulty, Village village)
    {
        int bonusMoney = 0;
        while (points > 0)
        {
            var enemy = this.GetEnemyWeighted(EnemyListFunction());
            if (difficulty <= 2 && enemy.Points <= 2)
            {
                AddEnemyAndUpdatePoints(enemyList, enemy, ref points, ref bonusMoney, village);
            }
            else if (difficulty > 2)
            {
                AddEnemyAndUpdatePoints(enemyList, enemy, ref points, ref bonusMoney, village);
            }
        }
     return bonusMoney;
    }

或多或少,我似乎遇到的问题是,如果一个敌人拥有高山,雪地和空中的地形,当前代码意味着如果只有高山,他们就不会与某物配对。它至少需要雪和山,或者山和空,并且有时最终会变成只有沙漠和森林的敌人。

1 个答案:

答案 0 :(得分:2)

[Flags]
public enum Options 
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

您可以使用下面的方法来包含和排除枚举标志。请注意〜(tilda)是排除性的

var condition = Options.Options1 | Options.Options2 | ~Options.Options3