2017-01-30 1 views
1

저는 프로그램에 필요한 시간 클래스를 작성했습니다. 나는 TimeSpan Class와 함께 할 수 있다는 것을 알고 있지만 나 자신을 쓰고 싶지만 이해하지 못한 실수가있다. 우선 클래스 :C# - 시간 클래스가 작동하지 않습니다.

public class Time 
{ 
    public int Minutes { get; set; } 
    public int Seconds { get; set; } 
    public int MilliSeconds { get; set; } 

    public Time(int minutes, int seconds, int milliSeconds) 
    { 
     Minutes = minutes; 
     Seconds = seconds; 
     MilliSeconds = milliSeconds; 
    } 

    public Time(string time) 
    { 
     if (time.Equals("DNF")) 
     { 
      Minutes = -1; 
      Seconds = -1; 
      MilliSeconds = -1; 
     } 
     else 
     { 
      Minutes = Convert.ToInt32(time.Split(':')[0]); 
      Seconds = Convert.ToInt32(time.Split(':')[1].Split(',')[0]); 
      MilliSeconds = Convert.ToInt32(time.Split(':')[1].Split(',')[1]); 
     } 
    } 

    public Time(long milliSeconds) 
    { 
     int minutes = 0; 
     while ((milliSeconds - 60000) > 0) 
     { 
      milliSeconds -= 60000; 
      minutes++; 
     } 
     int seconds = 0; 
     while ((milliSeconds - 1000) > 0) 
     { 
      milliSeconds -= 1000; 
      seconds++; 
     } 
     Minutes = minutes; 
     Seconds = seconds; 
     MilliSeconds = Convert.ToInt32(milliSeconds); 
    } 

    public override string ToString() 
    { 
     return Minutes == -1 && Seconds == -1 && MilliSeconds == -1 ? "DNF" : AddZeroWR(Minutes) + ":" + AddZeroWR(Seconds) + "," + AddZeroWR(MilliSeconds); 
    } 

    private string AddZeroWR(int i) 
    { 
     return i < 10 ? "0" + i : i.ToString(); 
    } 

    public long ToMilliSeconds() 
    { 
     long minutesMilliSeconds = Minutes * 60000; 
     long secondsMilliSeconds = Seconds * 1000; 
     return MilliSeconds + minutesMilliSeconds + secondsMilliSeconds; 
    } 

    public static List<Time> SortTimes(List<Time> times) 
    { 
     List<Time> times_ = new List<Time>(); 
     List<long> milliSeconds_ = new List<long>(); 
     foreach(Time time in times) 
     { 
      if(time.ToString() != "DNF") 
       milliSeconds_.Add(time.ToMilliSeconds()); 
     } 
     milliSeconds_.Sort(); 
     foreach (long l in milliSeconds_) 
     { 
      Time time = new Time(l); 
      times_.Add(time); 
     } 
     return times_; 
    } 

    public static Time CalculateAverage(List<Time> list) 
    { 
     long timeTogether = 0; 
     foreach (Time time in list) 
     { 
      timeTogether += time.ToMilliSeconds(); 
     } 
     double d = timeTogether/list.Count; 
     return new Time(Convert.ToInt64(Math.Round(d))); 
    } 

    public static Time CalculateBest(List<Time> list) 
    { 
     return SortTimes(list)[0]; 
    } 

    public static Time CalculateWorst(List<Time> list) 
    { 
     return SortTimes(list)[SortTimes(list).Count - 1]; 
    } 

    public static List<Time> RemoveTime(List<Time> list, Time time) 
    { 
     List<Time> times = new List<Time>(); 
     foreach (Time t in list) 
     { 
      if(!(t.Minutes == time.Minutes && t.Seconds == time.Seconds && t.MilliSeconds == time.MilliSeconds)) 
       times.Add(t); 
     } 
     return times; 
    } 
} 

문제가 SortTimes 방법 : I는, 예를 들어 그것의 4 배와 명부가 (mm : SS, MS) 1. 44 : 44,44, 22 (2) : 22, 22, 33 : 33, 33, 4. 11 : 11, 11. 그래서 내 방법으로 목록을 정렬 할 때 예전과 같지 않은 몇 가지 시간이 있습니다. 3. => SORT => 33 : 39,13 또는 그와 비슷한 것으로, 이유를 모르겠습니다. 나는 시간이 길고 뒤에서 변환 할 때 실수가 있다고 생각합니다.

+0

이 오류가 발생한 경우 최소한의 예를 제공해 주시겠습니까? 왜냐하면 내가 코드를 실행 한 후에도 문제를 발견 할 수 없었기 때문이다. –

+0

여기 예제 이미지 : http://i.imgur.com/GXNMVwp.png 두 번째 라인에서 "Zeit 5"는 99 : 99,99이고 "Schlech"도 99 : 99,99이어야하지만 그렇지 않습니다. –

+0

% 연산자를 살펴보십시오. 얼마나 많은 분과 초가 밀리 초 단위인지 계산하는 데 while 루프가 필요하지 않습니다. 나누기와 %를 사용하여 효율적으로 (그리고 안전하게) 계산할 수 있습니다. –

답변

2

귀하의 의견에 99 : 99,99가 다른 것으로 언급되었습니다. 99 초는 1 분 39 초이므로 Time에서 long으로 변환하고 다시 Time으로 다시 변환하면 100 : 39,99가됩니다.

: 초 값이 또한 이하 59

있을 때 동일한 오류를 생성 할 수있는 경우가 milliSeconds가 0보다 크거나 같은지 여부를 확인합니다, 그래서 당신은 아마 당신의 생성자 내에서 코드를 변경하려면, 확인

int minutes = 0; 
while ((milliSeconds - 60000) >= 0) 
{ 
    milliSeconds -= 60000; 
    minutes++; 
} 
int seconds = 0; 
while ((milliSeconds - 1000) >= 0) 
{ 
    milliSeconds -= 1000; 
    seconds++; 
} 

댓글로 추가했는데 아직 할 수 없습니다.

+0

그게 바로 xDDD. 감사 –

관련 문제