Получите время, необходимое для ввода консольного ввода в С#

У меня есть метод, который принимает ввод с консоли с помощью Console.ReadLine()

Я хочу знать, сколько времени потребовалось пользователю, чтобы написать ввод.

Я знаю, что могу записать время с помощью StopWatch, но я просто хочу записать время между нажатием первой клавиши и клавишей ввода.

Что я мог сделать?

Переведено с помощью переводчика Google


person VerbxteneSkillz    schedule 27.07.2018    source источник
comment
Какова цель этого? Что-то вроде «сколько времени ушло на ввод пароля»?   -  person Neil    schedule 27.07.2018
comment
Да, но это не пароль   -  person VerbxteneSkillz    schedule 27.07.2018
comment
Я хочу получить среднее время набора текста.   -  person VerbxteneSkillz    schedule 27.07.2018
comment
Я думаю, вам нужно использовать Console.ReadKey   -  person Magnetron    schedule 27.07.2018


Ответы (2)


Версия 1

Stopwatch stopWatch = new Stopwatch();

// Read first key pressed, then start stopwatch
var firstChar = Console.ReadKey();
stopWatch.Start();

// Read the rest followed by enter, then stop stopwatch
var restOfString = Console.ReadLine();
stopWatch.Stop();

// Join first char and rest of string together
var wholeString = string.Concat(firstChar.KeyChar, restOfString);
TimeSpan ts = stopWatch.Elapsed;

Console.WriteLine($"String entered: {wholeString}.");
Console.WriteLine($"It took {ts.Seconds} seconds.");
Console.ReadLine();

Версия 2

var keyInfo = new ConsoleKeyInfo();
var userInput = new StringBuilder();
var stopWatch = new Stopwatch();
var started = false;

do
{
     keyInfo = Console.ReadKey(false);

     if (started == false)
     {
          stopWatch.Start();
          started = true;
     }                

     switch (keyInfo.Key)
     {
          case ConsoleKey.Backspace:
              Console.Write(" \b");
              if(userInput.Length > 0) userInput.Remove(userInput.Length - 1, 1);
              break;
          // Stopping delete key outputting a space
          case ConsoleKey.Delete:
              Console.Write("\b");
              break;
          case ConsoleKey.Enter:
              break;
          default:
              userInput.Append(keyInfo.KeyChar);
              break;
    }
}
while (keyInfo.Key != ConsoleKey.Enter);

stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;

var finalString = userInput.ToString();

Console.WriteLine();

Console.WriteLine($"String entered: {finalString}.");
Console.WriteLine($"It took {ts.Seconds} seconds.");

Console.ReadLine();

Возможно, вы захотите убрать обработку других специальных символов, так как это просто решение вашей конкретной проблемы. Обратите внимание, что вместо этого вы можете использовать ReadKey(true) для перехвата ввода и остановки любого вывода. Затем вы можете управлять собственным выводом с помощью Console.Write().

Версия 3

Чтобы дать вам варианты, вот версия, которая перехватывает и контролирует вывод. Это было бы моим предпочтением.

var keyInfo = new ConsoleKeyInfo();
var userInput = new StringBuilder();
var stopWatch = new Stopwatch();
var started = false;

do
{
    keyInfo = Console.ReadKey(true);

    if (started == false)
    {
        stopWatch.Start();
        started = true;
    }

    if (keyInfo.Key == ConsoleKey.Backspace)
    {
        Console.Write("\b \b");
        if(userInput.Length > 0) userInput.Remove(userInput.Length - 1, 1);
    }
    else if (keyInfo.Key == ConsoleKey.Enter)
    {
        // Do nothing
    }
    else if(Char.IsLetter(keyInfo.KeyChar) ||
            Char.IsDigit(keyInfo.KeyChar) ||
            Char.IsWhiteSpace(keyInfo.KeyChar) ||
            Char.IsPunctuation(keyInfo.KeyChar))

    {
        Console.Write(keyInfo.KeyChar);
        userInput.Append(keyInfo.KeyChar);
    }
} while (keyInfo.Key != ConsoleKey.Enter);

stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;

var finalString = userInput.ToString();

Console.WriteLine();

Console.WriteLine($"String entered: {finalString}.");
Console.WriteLine($"It took {ts.Seconds} seconds.");

Console.ReadLine();
person Ben Hall    schedule 27.07.2018
comment
Проблема в том, что я не могу удалить первый символ на входе - person VerbxteneSkillz; 28.07.2018
comment
Вам не нужно. Только представьте, что это часть основной входной строки из ReadLine. Я разделил его, чтобы узнать, когда происходит первое нажатие клавиши. - person Ben Hall; 28.07.2018
comment
Но что, если я хочу удалить символ, продолжая писать предложение? - person VerbxteneSkillz; 28.07.2018
comment
Хорошо, версия 2 будет делать то, что вам нужно. - person Ben Hall; 28.07.2018
comment
И версия 3 показывает перехват вывода, чтобы вы могли легче контролировать, какие символы вы выводите и добавляете в строку. - person Ben Hall; 28.07.2018

Как насчет такого:

while (!Console.KeyAvailable)
    Thread.Sleep(250);

var start = DateTime.Now;
var input = Console.ReadString();
var stop = DateTime.Now; 
person Neil    schedule 27.07.2018
comment
Вы имеете в виду ReadLine()? - person Rufus L; 27.07.2018