C# char.GetNumericValue возвращает -1

У меня есть следующий код, который должен найти скрытый ключ в тексте.

private static string FindKey(string text)
{
    int keyLength = text[0];
    int[] keySliced = new int[keyLength];
    char[] fullText = text.ToCharArray();
    char[] chars = new char[text.Length - (1 + keyLength)];

    Console.WriteLine("Key Length -> {0}", keyLength);

    int y = 0;
    for(int i = 1 + chars.Length; i < 1 + chars.Length + keyLength; i++)
    {
        char chr = fullText[i];
        keySliced[y] = Convert.ToInt32(char.GetNumericValue(chr));
        Console.WriteLine("Key[{0}] -> {1}", y, keySliced[y]);
        y++;
    }
}

Проблема в том, что когда я запускаю этот код, он возвращает что-то вроде этого

Input: 5SampleText42964
Result:
Key[0] -> 4
Key[1] -> 2
Key[2] -> 9
Key[3] -> 6
Key[4] -> -1 //Here is the problem

Expected Result:
Key[0] -> 4
Key[1] -> 2
Key[2] -> 9
Key[3] -> 6
Key[4] -> 4

Значение Key[4] всегда равно -1, но не должно

Есть идеи как это исправить?

1 ответ

Решение

Вы не опубликовали полный пример в своем вопросе, поэтому мой ответ - только предположение.

Вы могли бы действительно упростить свою логику, используя LINQ:

//Assuming you have already checked the 'text' variable
//to make sure its not null or empty
int keyLength = (int)Char.GetNumericValue(text[0]);

if(keyLength < 0)
{
    //keyLength is -1 because the first digit was not a number
    //Handle appropriately
}
char[] keySliced = text.ToCharArray()
                       .Skip(1)
                       .Where(x => char.IsDigit(x))
                       .Take(keyLength)
                       .ToArray();

Что этот LINQ делает, так это берет входную строку и превращает ее в массив символов (.ToCharArray()). Тогда мы пропускаем первый символ (.Skip()) потому что мы уже учли это в логике keyLength. Тогда нас интересуют только те символы, которые являются цифрами (.Where(x => char.IsDigit(x))). Тогда мы берем до ключа длину ключа (.Take(keyLength)). Не то, что это будет принимать символы в порядке, и только до суммы, указанной в самой первой цифре строки (поэтому ввод, который "53dad223sfd32" не взял бы 53 но 5). Тогда похоже, что вы хотите получить результаты в массиве char, поэтому мы просто материализуем в массив (.ToCharArray())

keySliced теперь будет массив символов, содержащий все числа вплоть до длины, которую вы определили как первый символ в строке.

Для ввода: "5SampleText42964"

Результаты в:

Key[0] -> 4
Key[1] -> 2
Key[2] -> 9
Key[3] -> 6
Key[4] -> 4

Я сделал скрипку здесь

Другие вопросы по тегам