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
Я сделал скрипку здесь