首页 > 解决方案 > 比较相同枚举类型的对象的枚举

问题描述

我发现了与我要问的问题类似的问题,但不幸的是,它们不太适合我想要做的事情。

我有多个具有枚举类型的对象,称为 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 语句中的 points -=enemy.Points 只是为了防止这个问题导致的无限循环,否则可以忽略。

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;
    }

或多或少,我似乎遇到的问题是,如果敌人有山、雪和空气的地形,当前的代码意味着如果它只有山,他们就不会与某些东西配对。它至少需要雪和山,或者山和空气,有时最终会遇到只有沙漠和森林的敌人。

标签: c#

解决方案


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

you can use the approach below for including and excluding enum flags. please note that ~ (tilda) is for exclusion

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

推荐阅读