代码之家  ›  专栏  ›  技术社区  ›  XstreamINsanity

如何在枚举中包含整数字符串?

  •  2
  • XstreamINsanity  · 技术社区  · 16 年前

    我知道这是一个适当的枚举:

    Private Enum Months
      JANUARY = 1
      FEBRUARY = 2
      ...
    End Enum
    

    但是,我希望有一个枚举,其中的字符串将仅是整数。

    例子:

    Private Enum ColumnCounts
      01 = 5
      02 = 4
      03 = 40
    End Enum
    

    01、02和03都是字符串。但是,如果我输入“01”、[01]或只是01,它会告诉我它期望枚举结束,并且它不是有效的语句。有什么方法可以完成我所错过的?我甚至试过了。01.ToString(),但这不是一个选项。:)感谢所有人的帮助。谢谢。

    编辑:

    Public Class Part
    
      Private Enum ColumnCounts
        f01 = 39
      End Enum
    
      Public Shared Function ValidateColumns(ByRef lstFields As List(Of String)) As Boolean
        For Each colCount In [Enum].GetValues(GetType(ColumnCounts))
          If colCount = "f" + lstFields(1) Then
            'Right here I need to compare the count of the list vs. the value of the enum.'
            Return True
          End If
        Next
    
        Return False
      End Function
    End Class
    

    基本上,我不想把f放进去,只想做01。这将被称为:

    Select Case (nRecordType)
      Case "01"
        ...
      Case "02"
        ...
      Case "03"
        Return Part.ValidateColumns(_lstFields)
    End Select
    

    因为我没有创建它的实例,也没有调用构造函数,所以无法自动编写字典。我不想转换成整数,所以我不做数组。这只是为了防止最终值超过99,下一个值是A0。我在考虑将来对这个和向后兼容的简单改变。如果你需要更多的解释,请告诉我。

    编辑2:

    这就是我现在所做的,我认为应该管用:

    Public Class Part
    
      Private Shared columnCounts As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)
    
      Public Shared Function ValidateColumns(ByRef lstFiels As List(Of String)) As Boolean
        InitializeColumnDictionary()
    
        Return lstFields.Count = columnCounts(lstFields(1))
      End Function
    
      Private Shared Sub InitializeColumnDictionary()
        columnCounts.Add("01", 39)
      End Sub
    End Class
    

    我现在还不能测试它,所以我无法验证它是否能做我想做的事情,但它不会给我一个错误,当我建立它,所以我交叉我的手指。

    6 回复  |  直到 16 年前
        1
  •  3
  •   vulkanino    16 年前

    整数本身不是有效的标识符。 为什么要将01称为标识符? 在枚举元素前面加上一个字母,就完成了:

    i01,
    i02
    ...
    

    根据您的编辑进行编辑: 声明静态字典并在静态方法中填充它(如果为空):

    private static void yourMethod()
            {
                if (ColumnCounts == null)
                {
                    ColumnCounts = new Dictionary<String, int>();
                    ColumnCounts.Add("01", 39);
                    ColumnCounts.Add("02", 45);
                    ColumnCounts.Add("03", 12);
                    ColumnCounts.Add("04", 0);
                }
    
    
    
    
            }
    
    
    
            private static Dictionary<String, int> ColumnCounts = null;
    
        2
  •  2
  •   Timores    16 年前

    枚举元素是标识符;标识符必须以字母(或下划线)开头。所以,我很抱歉,但这是不可能的。

    注意:更正了注释后的起始字符。

        3
  •  1
  •   Oded    16 年前

    你需要使用 valid identifiers -不能以数字开头。

        4
  •  0
  •   Joachim VR    16 年前

    抱歉,不能让任何类型的标识符以整数开头。你可以:

    Private Enum ColumnCounts
      n01 = 5
      n02 = 4
      n03 = 40
    End Enum
    
        5
  •  0
  •   Joel Etherton    16 年前

    对于枚举,应该使用Column01作为标识符。在后面的代码中,如果不需要01部分,则始终可以调用.ToString()并删去列部分。

    Private Enum ColumnCounts 
      Column01 = 5 
      Column02 = 4 
      Column03 = 40 
    End Enum 
    
        6
  •  0
  •   dbasnett    16 年前

    0.02美元

    Private Enum foo As Integer
        _01 = 1
        _02 = 2
        _03 = 3
        _04 = 4
    End Enum
    
    Dim bar As IEnumerable(Of String) = (From membr In [Enum].GetNames(GetType(foo)) Select membr.Replace("_", ""))
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        Dim nRecordType As String = "03"
    
        Select Case nRecordType
            Case bar(0)
                Debug.WriteLine("stop1")
                Stop
            Case bar(1)
                Debug.WriteLine("stop2")
                Stop
            Case bar(2)
                Debug.WriteLine("stop3")
                Stop
            Case bar(3)
                Debug.WriteLine("stop4")
                Stop
        End Select
    
    End Sub