Как определить меньшее время 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
Другие вопросы по тегам