Как получить целочисленную строку в перечислении? - PullRequest
2 голосов
/ 08 октября 2010

Я знаю, что это правильное перечисление:

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, он скажет, что ожидает конца Enum и что это недопустимое утверждение.Есть ли способ сделать это, что я скучаю?Я даже попробовал.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 ]

3 голосов
/ 08 октября 2010

Только целые числа НЕ являются действительными идентификаторами.Почему вы хотите назвать 01 идентификатором?Поставьте перед элементами enum букву, и все готово:

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 голосов
/ 08 октября 2010

Элементы перечисления являются идентификаторами;и идентификаторы должны начинаться с буквы (или подчеркивания).Извините, но это невозможно.

Примечание: исправлены начальные символы после комментария.

1 голос
/ 08 октября 2010

Вам необходимо использовать допустимые идентификаторы - которые не могут начинаться с цифры.

0 голосов
/ 08 октября 2010

$. 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
0 голосов
/ 08 октября 2010

Для вашего перечисления вы должны использовать Column01 для идентификатора. Позже в вашем коде, если вам не нужна часть 01, вы всегда можете вызвать .ToString () и обрезать часть Column.

Private Enum ColumnCounts 
  Column01 = 5 
  Column02 = 4 
  Column03 = 40 
End Enum 
0 голосов
/ 08 октября 2010

Извините, невозможно позволить любому идентификатору начинаться с целого числа.Вы можете сделать:

Private Enum ColumnCounts
  n01 = 5
  n02 = 4
  n03 = 40
End Enum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...