C# using numbers in an enum

前端 未结 8 1350
迷失自我
迷失自我 2020-11-30 03:02

This is a valid enum

public enum myEnum
{
  a= 1,
  b= 2,
  c= 3,
  d= 4,
  e= 5,
  f= 6,
  g= 7,
  h= 0xff
};

But this is not



        
相关标签:
8条回答
  • 2020-11-30 03:25

    Short and crisp 4 line code.

    We simply use enums as named integer for items in code,

    so any simplest way is good to go.

    public enum myEnum
    {
        _1A = 1,
        _2A,
        _3A,
    };
    

    Also for decimal values,

    public enum myEnum
    {
        _1_5 = 1,
        _2_5,
        _3_5,
    };
    

    So while using this in code,

    int i = cmb1.SelectedIndex(0); // not readable
    int i = cmb1.SelectedIndex( (int) myEnum._1_5); // readable
    
    0 讨论(0)
  • 2020-11-30 03:29

    An identifier in C# (and most languages) cannot start with a digit.

    If you can modify the code that populates a dropdown with the enumeration names, you could maybe have a hack that strips off a leading underscore when populating the dropdown and define your enum like so:

    public enum myEnum
    {
      _1a = 1,
      _2a = 2,
      _3a = 3
    };
    

    Or if you don't like the underscores you could come up with your own 'prefix-to-be-stripped' scheme (maybe pass the prefix to the constructor or method that will populate the dropdown from the enum).

    0 讨论(0)
  • 2020-11-30 03:37

    Here is what i came up with as an alternative, where I needed Enums to use in a "for" Loop and a string representation equivalent to use in a Linq query.

    1. Create enums namespace to be used in "for" Loop.
    public enum TrayLevelCodes
        {
            None,
            _5DGS,
            _5DG,
            _3DGS,
            _3DG,
            _AADC,
            _ADC,
            _MAAD,
            _MADC
        };
    
    1. Create strings based on enum created to be used for Linq query
    public string _5DGS = "\"5DGS\"",
            _5DG = "\"5DG\"",
            _3DGS = "\"3DGS\"",
            _3DG = "\"3DG\"",
            _AADC = "\"AADC\"",
            _ADC = "\"ADC\"",
            _MAAD = "\"MAAD\"",
            _MADC = "\"MADC\"";
    
    1. Create function that will take an enum value as argument and return corresponding string for Linq query.
    public string GetCntnrLvlDscptn(TrayLevelCodes enumCode)
            {
                string sCode = "";
                switch (enumCode)
                {
                    case TrayLevelCodes._5DGS:
                        sCode = "\"5DGS\"";
                        break;
                    case TrayLevelCodes._5DG:
                        sCode = "\"5DG\"";
                        break;
                    case TrayLevelCodes._3DGS:
                        sCode = "\"3DGS\"";
                        break;
                    case TrayLevelCodes._3DG:
                        sCode = "\"3DG\"";
                        break;
                    case TrayLevelCodes._AADC:
                        sCode = "\"AADC\"";
                        break;
                    case TrayLevelCodes._ADC:
                        sCode = "\"AAC\"";
                        break;
                    case TrayLevelCodes._MAAD:
                        sCode = "\"MAAD\"";
                        break;
                    case TrayLevelCodes._MADC:
                        sCode = "\"MADC\"";
                        break;
                    default:
                        sCode = "";
                        break;
                }
                    return sCode;
            }
    
    1. Here is how i am using what i created above.
    for (var trayLevelCode = TrayLevelCodes._5DGS; trayLevelCode <= TrayLevelCodes._MADC; trayLevelCode++)
    {
        var TrayLvLst = (from i in pair1.Value.AutoMap
                         where (i.TrayLevelCode == HTMLINFO.GetCntnrLvlDscptn(trayLevelCode))
                         orderby i.TrayZip, i.GroupZip
                         group i by i.TrayZip into subTrayLvl
                         select subTrayLvl).ToList();
        foreach (DropShipRecord tray in TrayLvLst)
        {
    
        }
    }
    
    0 讨论(0)
  • 2020-11-30 03:40

    No identifier at all in C# may begin with a number (for lexical/parsing reasons). Consider adding a [Description] attribute to your enum values:

    public enum myEnum
    {
        [Description("1A")]
        OneA = 1,
        [Description("2A")]
        TwoA = 2,
        [Description("3A")]
        ThreeA = 3,
    };
    

    Then you can get the description from an enum value like this:

    ((DescriptionAttribute)Attribute.GetCustomAttribute(
        typeof(myEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
            .Single(x => (myEnum)x.GetValue(null) == enumValue),    
        typeof(DescriptionAttribute))).Description
    

    Based on XSA's comment below, I wanted to expand on how one could make this more readable. Most simply, you could just create a static (extension) method:

    public static string GetDescription(this Enum value)
    {
        return ((DescriptionAttribute)Attribute.GetCustomAttribute(
            value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)
                .Single(x => x.GetValue(null).Equals(value)),
            typeof(DescriptionAttribute)))?.Description ?? value.ToString();
    }
    

    It's up to you whether you want to make it an extension method, and in the implementation above, I've made it fallback to the enum's normal name if no [DescriptionAttribute] has been provided.

    Now you can get the description for an enum value via:

    myEnum.OneA.GetDescription()
    
    0 讨论(0)
  • 2020-11-30 03:40

    Enumerations are no different than variables in terms of naming rules. Therefore, you can't start the name with a number. From this post, here are the main rules for variable naming.

    • The name can contain letters, digits, and the underscore character (_).

      • The first character of the name must be a letter. The underscore is also a legal first character, but its use is not recommended at the beginning of a name. An underscore is often used with special commands, and it's sometimes hard to read.

      • Case matters (that is, upper- and lowercase letters). C# is case-sensitive; thus, the names count and Count refer to two different variables.

      • C# keywords can't be used as variable names. Recall that a keyword is a word that is part of the C# language. (A complete list of the C# keywords can be found in Appendix B, "C# Keywords.")

    0 讨论(0)
  • 2020-11-30 03:46

    Identifiers can't start with numbers. However, they can contain numbers.

    0 讨论(0)
提交回复
热议问题