Как использовать позицию индексации вставки в начальной позиции 3 кода Код динамически вместо нескольких if - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу использовать код Dynami c, потому что, когда мы используем 100 уровней, я не могу написать If оператор 100 раз. Как мы можем написать код Dynami c, если уровень равен любому значению, например 5, затем вставить 5 начальных позиций индекса, как для позиции 0 -> A, 1 -> B, 2 -> C, 3-- > D, 4 -> E. До позиции индекса 5 я установил:

Dim Fur As String
Dim FAry As Array

If Levels = 5 Then
    FAry = Split(Fur.Insert(0, "A,B,C,D,E,"), ",")

ElseIf Levels = 4 Then
    FAry = Split(Fur.Insert(0, "A,B,C,D,"), ",")

ElseIf Levels = 3 Then
    FAry = Split(Fur.Insert(0, "A,B,C,"), ",")

ElseIf Levels = 2 Then
    FAry = Split(Fur.Insert(0, "A,B,"), ",")

ElseIf Levels = 1 Then
    FAry = Split(Fur.Insert(0, "A,"), ",")

ElseIf Levels = 0 Then
    FAry = Split(Fur, ",")

End If

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

См. https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.copyto?view=netcore-3.1#System_Collections_Generic_List_1_CopyTo_System_Int32__0___System_Int32_System_Int32_ для более подробной информации о методе .CopTo.

Private Function GetArray(Levels As Integer) As String()
    'Create a List(Of T) with all the elements you want to use
    Dim lst As New List(Of String) From {"A,", "B,", "C,", "D,", "E,", "F,", "G,", "H,", "I,", "J,"}
    'Declare an array of the proper size
    Dim FAry(Levels - 1) As String
    'CopyTo(Int32, T[], Int32, Int32)
    lst.CopyTo(0, FAry, 0, Levels)
    Return FAry
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim MyNewArray = GetArray(5)
    For Each item In MyNewArray
        Debug.Print(item)
    Next
End Sub
0 голосов
/ 25 апреля 2020

Вам понадобится функция для преобразования значения levels в список кодов (букв). Для этого проще всего использовать List (Of String) вместо Array, поскольку список расширяется автоматически при добавлении в него дополнительных записей. Вам также понадобится функция для преобразования значения в буквенный код.

Например, консольное приложение basi c:

Module Module1

    Function LetterCode(n As Integer) As String
        If n = 0 Then Return String.Empty
        If n > 26 * 27 Then
            Throw New ArgumentException("Argument greater than 26*27 (702) - no more two-letter codes available after ""ZZ"".")
        End If

        Dim lc As String = Chr(65 + ((n - 1) Mod 26))

        If n > 26 Then
            lc = Chr(65 + ((n - 1) \ 26 - 1) Mod 26) & lc
        End If

        Return lc

    End Function

    Function LetterCodes(n As Integer) As List(Of String)
        Dim lcs As New List(Of String)
        For i = 1 To n
            lcs.Add(LetterCode(i))
        Next

        Return lcs

    End Function

    Sub Main()

        Dim fur = "1,2,3" ' example data

        Dim levels = 67
        Dim furParts = fur.Split({","c})
        Dim fAry = If(levels = 0, furParts, LetterCodes(levels).Concat(furParts)).ToArray()

        Console.WriteLine(String.Join(",", fAry))

        Console.ReadLine()

    End Sub

End Module

Выходы:

A, B C, D, Е, F, G, H, I, J, K, L, M, N, О, Р, Q, R, S, Т, U, V, W, Х , Y, Z, AA, AB, A C, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, А.Н., AO, AP, AQ, AR, AS, AT, AU, А. В., AW, Ax, Ay, AZ, ВА, ВВ, В C, BD, BE, BF, BG, BH и BI, BJ, BK, BL, BM, БН, БО, 1,2,3

Обратите внимание, что вместо .ToArray() вы можете использовать .ToList(), поскольку список более универсален, или даже опустить его, чтобы получить IEnumerable (Of String), который не будет оцениваться до тех пор, пока используется, если это было разумно.

0 голосов
/ 24 апреля 2020

Это необычный способ подойти к основной задаче c «Я хочу массив, в котором есть N чисел, подсчитанных буквами».

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

Public Shared Function ToBase(base10 As Long, Optional baseChars As String = "0123456789ABCDEFGHIJKLMNOPQRTSUVWXYZ") As String

    If baseChars.Length < 2 Then Throw New ArgumentException("baseChars must be at least 2 chars long")

    If base10 = 0 Then Return baseChars(0)

    Dim isNegative = base10 < 0
    Dim radix = baseChars.Length
    Dim index As Integer = 64 'because it's how long a string will be if the basechars are 2 long (binary)
    Dim chars(index) As Char '65 chars, 64 from above plus one for sign if it's negative

    base10 = Math.Abs(base10)


    While base10 > 0
        chars(index) = baseChars(base10 Mod radix)
        base10 \= radix

        index -= 1
    End While

    If isNegative Then
        chars(index) = "-"c
        index -= 1
    End If

    Return New String(chars, index + 1, UBound(chars) - index)

End Function

Теперь давайте используем ее для генерации 100 «чисел» в базе 26 (A = 0, B = 1, ..., J = 9, K = 10, ..., Z = 25, А = 26). Следует отметить, что следующим «числом» после «Z» является «BA», а не «AA», по той же причине, что 9 + 1 - это 10, а не 00; «А» - это символ «ноль», поэтому он не ведет. Если это сбивает с толку, учтите, что «Z» не «Z», это «AZ», например, 9 не 9, а 09. Добавление одного к 09 становится 10. Добавление одного к «AZ» означает «BA»

Dim x as New List(Of String)(100)
For i = 0 to 99
  x.Add(ToBase(i, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
Next i

Вы получите список с этим в:

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,
CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ,
DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,DS,DT,DU,DV
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...