【问题标题】:Compare Enums in if statement比较 if 语句中的枚举
【发布时间】:2020-06-10 14:42:41
【问题描述】:

我想比较一些关于 ifs 语句的枚举,这就是我的意思,但这不起作用。基本上我想看看受伤是否与枚举相同,因此如果受伤流血,则需要包扎等。如果您需要任何其他信息,请告诉我。

static string injuries = GetInjuriesName(GetInjuries(closestPlayer));
EPedInjuries result;
if (Enum.TryParse(injuries, out result) && result == EPedInjuries.Overdose)
{
.....
}
else if (Enum.TryParse(injuries, out result) && result == EPedInjuries.GunShotWound)
{
....
}
....


public enum EPedInjuries
{
    OpenFracture,
    GunShotWound,
    Fever,
    BrokenLeg,
    BrokenArm,
    BrokenRib,
    Overdose,
    .....
}

    public static EPedInjuries GetInjuries(Ped ped)
    {
        Ped = ped;
        int num = API.Common.Random.Next(0, 101);
        if (num >= 0 && num <= 37)
        {
            return EPedInjuries.Overdose;
        }
        if (num > 37 && num <= 55)
        {
            return EPedInjuries.GunShotWound;
        }
        if (num > 55 && num <= 72)
        {
            return EPedInjuries.CardiacArrest;
        }
        ....
}


public static string GetInjuriesName(EPedInjuries injuries)
{
    string result = string.Empty;
    switch (injuries)
    {
        case EPedInjuries.Overdose:
            result = "~r~Overdose";
            break;
        case EPedInjuries.GunShotWound:
            result = "~r~Gunshot Wound";
            break;
        case EPedInjuries.CardiacArrest:
            result = "~r~Cardiac Arrest";
            break;
        ....
    }
    return result;
}

【问题讨论】:

  • 似乎很奇怪将伤害转换为字符串只是将其转换回伤害。
  • 为什么不只使用GetInjuries 方法并与从它返回的值进行比较?
  • @Borka 我该怎么做?使用 TryParse 方法?
  • @JohnnyMopp 我的意思是比较不起作用。不知道我还应该包括什么。

标签: c# if-statement enums compare


【解决方案1】:

GetInjuries 方法已返回您要比较的枚举类型。正如@Johnny Mopp 指出的那样,您正在获取枚举,将其转换为某个字符串,只是为了尝试将其转换回枚举

做事

EPedInjuries result = GetInjuries(closestPlayer);
if (result == EPedInjuries.Overdose)
{
.....
}
else if (result == EPedInjuries.GunShotWound)
{
....
}

【讨论】:

    【解决方案2】:

    您的GetInjuriesName 返回的字符串不是正确的枚举值,Enum.TryParse 无法解析它并返回false

    var injuries = GetInjuriesName(EPedInjuries.Overdose);
    Console.WriteLine(injuries); //prints "~r~Overdose"
    Console.WriteLine(Enum.TryParse(injuries, out EPedInjuries result)); // prints "False"
    

    只需引入两个字段/变量,一个用于名称,一个用于伤害枚举值:

    EPedInjuries injury = GetInjuries(closestPlayer)
    string injuryName = GetInjuriesName(injury);
    

    并使用第一个来处理逻辑:

    if(injury == EPedInjuries.Overdose)
    {
        ....
    } 
    .....
    

    【讨论】:

    • @John35352 很乐意提供帮助!
    【解决方案3】:

    我相信您会从其他地方收到字符串,因此您想要进行转换,这就是您使用 GetInjuriesName 方法的原因。对我来说,你应该打开你收到的字符串。

    为了修复此代码,您应该从字符串中删除“~r~”,以便它匹配任何枚举类型。

    此外,枚举不能为空,因此您将始终获得第一个值,即默认值。

    public static string GetInjuriesName(EPedInjuries injuries)
    {
        string result = string.Empty;
        switch (injuries)
        {
            case EPedInjuries.Overdose:
                result = "Overdose";
                break;
            case EPedInjuries.GunShotWound:
                result = "Gunshot Wound";
                break;
            case EPedInjuries.CardiacArrest:
                result = "Cardiac Arrest";
                break;
        }
        return result;
    }
    

    然后 TryParse 将工作并产生包含在枚举中的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2014-03-15
      相关资源
      最近更新 更多