Как я могу имитировать пользовательский ввод с консоли?
Я делаю некоторые проблемы в HackerRank. Я обычно использую windows Form
Проект в Visualstudio, чтобы сделать отладку, но понимаю, что я потерял много времени ввода тестовых случаев. Поэтому я хочу предложить способ, которым я могу легко смоделировать console.ReadLine()
Обычно проблемы описывают случаи примерно так:
5
1 2 1 3 2
3 2
А затем читается как: используя три ReadLine
static void Main(String[] args) {
int n = Convert.ToInt32(Console.ReadLine());
string[] squares_temp = Console.ReadLine().Split(' ');
int[] squares = Array.ConvertAll(squares_temp,Int32.Parse);
string[] tokens_d = Console.ReadLine().Split(' ');
int d = Convert.ToInt32(tokens_d[0]);
int m = Convert.ToInt32(tokens_d[1]);
// your code goes here
}
Прямо сейчас я думал в создании файла testCase.txt
и использовать StreamReader.
using (StreamReader sr = new StreamReader("testCase.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
Таким образом, я могу заменить Console.ReadLine()
с sr.ReadLine()
, но для этого нужно открыть текстовый редактор, удалить старый регистр, скопировать новый и каждый раз сохранять файл.
Так есть ли способ, которым я могу использовать Textbox, так что нужно только копировать / вставить в текстовое поле и использовать streamReader или что-то похожее для чтения из текстового поля?
3 ответа
Вы можете использовать класс StringReader для чтения из string
а не файл.
Решение , которое вы приняли! на самом деле не эмулирует Console.ReadLine(), поэтому вы не можете вставить его напрямую в HackerRank.
Я решил это так:
.
.
Просто вставьте этот класс над статическим методом Main или в любое место внутри основного класса, чтобы скрыть исходный System.Console
class Console
{
public static Queue<string> TestData = new Queue<string>();
public static void SetTestData(string testData)
{
TestData = new Queue<string>(testData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(x=>x.TrimStart()));
}
public static void SetTestDataFromFile(string path)
{
TestData = new Queue<string>(File.ReadAllLines(path));
}
public static string ReadLine()
{
return TestData.Dequeue();
}
public static void WriteLine(object value = null)
{
System.Console.WriteLine(value);
}
public static void Write(object value = null)
{
System.Console.WriteLine(value);
}
}
и используйте его таким образом.
//Paste the Console class here.
static void HackersRankProblem(String[] args)
{
Console.SetTestData(@"
6
6 12 8 10 20 16
");
int n = int.Parse(Console.ReadLine());
string arrStr = Console.ReadLine();
.
.
.
}
Теперь ваш код будет выглядеть так же! и вы можете протестировать столько данных, сколько захотите, не меняя код.
Примечание. Если вам нужно больше сложных методов Write или WriteLine, просто добавьте их и отправьте в исходный System.Console(..args)
Просто установите аргументы приложения: <input.txt
и укажите в input.txt свой вводимый текст.
Будьте осторожны, чтобы сохранить файл с кодировкой ANSI.