开发者

.NET C# Logic Function, recurrent function

开发者 https://www.devze.com 2023-03-09 09:58 出处:网络
I have some string in format like that XXXX-XXXX-X_X_ All \"_\" should be replaced with Letters and numberst to prodce sth like that:

I have some string in format like that

XXXX-XXXX-X_X_

All "_" should be replaced with Letters and numberst to prodce sth like that:

XXXX-XXXX-XAXA
XXXX-XXXX-XAXB
XXXX-XXXX-XAXC
XXXX-XXXX-XAXD
XXXX-XXXX-XAXE
XXXX-XXXX-XAXF
XXXX-XXXX-XAXG
(...)
XXXX-XXXX-XZX8
XXXX-XXXX-XZX9
XXXX-XXXX-X0XA
(...)
XXXX-XXXX-X2XA
XXXX-XXXX-X2XB

I know hoe to make it with one "_".

                string alphaLetters = "ABCDEFGHIJKLMNOPQRSTUWXYZ0123456789ABCDEF";
                foreach (char letter in alphaLetters.ToCharArray())
                {
            开发者_开发技巧        Numbers.Add(number.Replace('_', letter)));                     
                }

I want this code to be working with unknown number of "_".

Can you help?


IMHO it must be recursive. (Note: that does not mean it must use recursive method call, although I used recursive call in the following code, it can be easily converted to internal recursion stack. )

public static void RunSnippet()
{
    var r = new List<string>();
    Replace("asd_asd_asd_".ToCharArray(), 0, r);
    foreach(var s in r) { Console.WriteLine(s); }
}

public static char[] possibilities = new char[] { 'A', 'B', 'C' };

public static void Replace(char[] chars, int startIndex, IList<string> result)
{       
    for (int i = startIndex; i < chars.Length; i++)
    {
        if (chars[i] != '_')
        {
            continue;
        }

        // we found first '_'
        for (int j = 0; j < possibilities.Length; j++)
        {
            chars[i] = possibilities[j];
            Replace(chars, i + 1, result);              
        }

        chars[i] = '_'; // take back what we replaced
        return; //we're done here
    }

    // we didn't find any '_', so all were replaced and we have result:
    result.Add(new string(chars));
}


Try this one:

var alphaIndexes = new List<int>();
string alphaLetters = "ABCDEFGHIJKLMNOPQRSTUWXYZ0123456789ABCDEF";

for(int n = 0; n<Numbers.Count; n++) {
    char[] numberLetters = Numbers[n].ToCharArray();

    int position = 0;

    for(int i = numberLetters.Length - 1; i>=0; i--) {  
        if(numberLetters[i] == '_') {
            int alphaIndex = 0;
            if(alphaIndexes.Count <= position)
                alphaIndexes.Add(0);
            else {
                alphaIndex = alphaIndexes[position];
            }

            numberLetters[i] = alphaLetters[alphaIndex];
            position++;         
        }
    }

    if(alphaIndexes.Count > 0) {
        alphaIndexes[0]++;

        for(int j = 0; j < alphaIndexes.Count; j++) {
            if(alphaIndexes[j] >= alphaLetters.Length) {
                alphaIndexes[j] = 0;
                if (j < alphaIndexes.Count)
                    alphaIndexes[j+1]++;
            }
        }
    }
    Numbers[n] = new String(numberLetters);
    Numbers[n].Dump();
}
0

精彩评论

暂无评论...
验证码 换一张
取 消