Как определить меньшее время C#
Мне требуется способ сохранить наименьшее время для замены любого существующего, но в настоящее время то, что я пробовал [ниже], не работает и иногда может сказать, что 2:38.4 меньше, чем 2:20.1.
В текстовом файле
88:88:8
В форме 3 текстовых поля
timerMin
timerSec
timerMil
Запись в правильный путь.
using (TextReader reader = File.OpenText(pathPlayer + player[id].name + "\\time.txt"))
{
string z = reader.ReadLine();
string[] zsplit = z.Split(':');
reader.Close();
fileMin = Convert.ToInt32(timerMinute.Text);
recMin = Convert.ToInt32(zsplit[0]);
if (fileMin < recMin)
{
File.WriteAllText(pathPlayer + player[id].name + "\\time.txt", timerMinute.Text + ":" + timerSecond.Text + ":" + timerMili.Text);
newPersonalRecord = true;
}
else
{
fileSec = Convert.ToInt32(timerSecond.Text);
recSec = Convert.ToInt32(zsplit[1]);
if (fileSec < recSec)
{
File.WriteAllText(pathPlayer + player[id].name + "\\time.txt", timerMinute.Text + ":" + timerSecond.Text + ":" + timerMili.Text);
newPersonalRecord = true;
}
else
{
fileMil = Convert.ToInt32(timerMili.Text);
recMil = Convert.ToInt32(zsplit[1]);
if (fileMil < recMil)
{
File.WriteAllText(pathPlayer + player[id].name + "\\time.txt", timerMinute.Text + ":" + timerSecond.Text + ":" + timerMili.Text);
newPersonalRecord = true;
}
else
{
}
}
}
}
Я работал над этим в течение долгого времени, и я не могу видеть, где я ошибся, и помощь была бы блестящей.
Спасибо
3 ответа
Вы сравниваете текстовые поля, когда вы должны сравнивать TimeSpans
если строки в файле не превышают время суток (до "23:59:59"), вы можете использовать строки для создания TimeSpans, выполнив TimeSpan.Parse("18:44:08");
и сравни их как
fileMin = new TimeSpan(0, 0, int.Parse(timerMin), int.Parse(timerSec), int.Parse(timerMil));
recTimeSpan = TimeSpan.Parse(z);
if(fileMin > recTimeSpan)
{// Your code}
else
{// Your code}
ты всегда можешь сделать
recTimeSpan = new TimeSpan(0, 0, int.Parse(zsplit[0]), int.Parse(zsplit[1]), int.Parse(zsplit[2]));
Это скорее дизайнерское замечание, но я настоятельно рекомендую вам использовать класс TimeSpan для чего-то подобного, а не для целых чисел; это сделало бы ваш код намного проще как для написания, так и для чтения. Вы можете создать новый интервал TimeSpan из данных времени, которые вы извлекаете, а затем просто использовать один оператор сравнения, чтобы определить, больше ли он, меньше или равен существующей записи, а не один для секунд и миллисекунд без минут.
DateTime также может работать, если вы используете его для отслеживания времени начала и окончания (вы можете легко найти разницу между DateTimes как TimeSpan, просто используя оператор вычитания)
Например:
DateTime StartTime
DateTime EndTime
TimeSpan difference = EndTime = StartTime
В вашем коде много повторений, которые вы должны стремиться устранить. Вы также можете использовать TimeSpan
хранить значения и сравнивать их.
Попробуйте что-то вроде этого:
string filePath = pathPlayer + player[id].name + "\\time.txt";
string z = null;
using (TextReader reader = File.OpenText(filePath))
{
z = reader.ReadLine();
}
string[] zsplit = z.Split(':');
//Create a timespan from the values read from the .txt file
TimeSpan fileTime = new TimeSpan(0, 0, int.parse(zsplit[0]), int.parse(zsplit[1]), int.parse(zsplit[2]));
//Create a timespan from the values stored in the Textbox controls
TimeSpan inputTime = new TimeSpan(0, 0, int.parse(timerMinute.Text), int.parse(timerSecond.Text), int.parse(timerMili.Text));
//Check if the new TextBox time is faster than the time stored in the file
if(inputTime < fileTime)
{
//new faster time, so update the file
File.WriteAllText(filePath, inputTime.ToString("mm:ss:f"));
newPersonalRecord = true;
}
Несколько вещей, на которые стоит обратить внимание:
- На входе нет проверки, поэтому недействительные данные приведут к сбою приложения (необходимо добавить проверку, см.:
int.TryParse
). Вы также хотите проверитьz
не является нулевым, иzsplit
имеетLength
по крайней мере3
- Ваше имя
fileMin
а такжеrecMin
не соответствует вашему источнику данных, я переименовал их вfileTime
а такжеinputTime
быть более ясным - Этот пример проверяет, если
inputTime
меньше чемfileTime
, если вы хотите по-другому, просто переключите их вif
заявление - Использование
TimeSpan
в этом примере предполагается, что минутный компонент никогда не может быть больше59