Как преобразовать Console.Readkey в int C#
Я пытаюсь преобразовать пользовательский ключ ввода в int, пользователь будет вводить число от 1 до 6.
Это то, что я до сих пор сидел внутри метода, он не работает, но создание исключения формата было необработанным.
var UserInput = Console.ReadKey();
var Bowl = int.Parse(UserInput.ToString());
Console.WriteLine(Bowl);
if (Bowl == 5)
{
Console.WriteLine("OUT!!!!");
}
else
{
GenerateResult();
}
}
Спасибо за вашу помощь!
4 ответа
Просто сказал, что вы пытаетесь конвертировать System.ConsoleKeyInfo
для int
,
В вашем коде, когда вы звоните UserInput.ToString()
то, что вы получите, это строка, которая представляет текущий объект, а не удержание value
или же Char
как вы ожидаете.
Чтобы получить холдинг Char
как String
ты можешь использовать UserInput.KeyChar.ToString()
Более того, вы должны проверить ReadKey
для digit
прежде чем пытаться использовать int.Parse
метод. Так как Parse
методы генерируют исключения, когда не удается преобразовать число.
Так это будет выглядеть так,
int Bowl; // Variable to hold number
ConsoleKeyInfo UserInput = Console.ReadKey(); // Get user input
// We check input for a Digit
if (char.IsDigit(UserInput.KeyChar))
{
Bowl = int.Parse(UserInput.KeyChar.ToString()); // use Parse if it's a Digit
}
else
{
Bowl = -1; // Else we assign a default value
}
И твой код:
int Bowl; // Variable to hold number
var UserInput = Console.ReadKey(); // get user input
int Bowl; // Variable to hold number
// We should check char for a Digit, so that we will not get exceptions from Parse method
if (char.IsDigit(UserInput.KeyChar))
{
Bowl = int.Parse(UserInput.KeyChar.ToString());
Console.WriteLine("\nUser Inserted : {0}",Bowl); // Say what user inserted
}
else
{
Bowl = -1; // Else we assign a default value
Console.WriteLine("\nUser didn't insert a Number"); // Say it wasn't a number
}
if (Bowl == 5)
{
Console.WriteLine("OUT!!!!");
}
else
{
GenerateResult();
}
Есть ConsoleKeys для числовых значений. ConsoleKey.D5 для 5.
Блок кода может быть переписан как -
var bowl = -1;
var userInput = Console.ReadKey();
if(userInput.Key == ConsoleKey.D5)
{
bowl = 5;
}
Вот класс расширения, который делает его немного более расширяемым, и не только для целых чисел:
using System;
/// <summary>
/// Extension methods for <see cref="ConsoleKeyInfo"/>
/// </summary>
public static class ConsoleKeyInfoExtensions
{
/// <summary>
/// Attempts to cast the <see cref="ConsoleKeyInfo.KeyChar"/> value from the <paramref name="instance"/> to <typeparamref name="T"/>.
/// </summary>
/// <typeparam name="T">The generic type to cast to.</typeparam>
/// <param name="instance">The <see cref="ConsoleKeyInfo"/> to extract the value from</param>
/// <returns>Returns the value in the <see cref="ConsoleKeyInfo.KeyChar"/> as <typeparamref name="T"/></returns>
/// <exception cref="InvalidCastException">If there is an issue with the casting. For example, boolean is not valid.</exception>
/// <exception cref="ArgumentNullException">If the <paramref name="instance"/> is null.</exception>
public static T GetValue<T>(this ConsoleKeyInfo instance)
{
if (instance == null)
throw new ArgumentNullException(nameof(instance));
var stringValue = instance.KeyChar.ToString();
try
{
return (T)Convert.ChangeType(stringValue, typeof(T));
}
catch
{
throw new InvalidCastException($"Unable to cast a {nameof(ConsoleKeyInfo.KeyChar)} to a type of {typeof(T).FullName}.");
}
}
}
Приветствия
Так же:
ConsoleKeyInfo info = Console.ReadKey();
int val;
if (int.TryParse(info.KeyChar.ToString(), out val))
{
Console.WriteLine("You pressed " + val.ToString());
}
Вот краткий ответ без проверки ошибок.
int.Parse(Console.ReadKey().KeyChar.ToString());