2009-09-10 16 views
8

Chcę uzyskać stosunek jednego TimeSpan do innego TimeSpan (Zasadniczo postęp odtwarzania wideo z jego całkowitego czasu). Moje obecne metody to uzyskanie milisekund dwóch obiektów TimeSpan i podzielenie ich na siebie. Coś jak:Jaki jest najlepszy sposób dzielenia dwóch obiektów TimeSpan?

 int durationInMilliseconds = totalTimeSpan.Milliseconds; 
     int progressInMilliseconds = progressTimeSpan.Milliseconds; 

     Double progressRatio = progressInMilliseconds/durationInMilliseconds; 

Czy istnieje bardziej bezpośrednia trasa? To prosty problem i jestem ciekawy, czy istnieje super elegancki sposób, aby go rozwiązać.

Pozdrawiam wszystkich James

Odpowiedz

16

Należy użyć jednej Ticks lub TotalMilliseconds, w zależności od wymaganej dokładności. Milliseconds to liczba milisekund po ostatniej sekundie.

Jeśli chodzi o lepsze rozwiązanie, nie jest ono prostsze niż podział, więc obecne rozwiązanie jest w porządku (bez błędu).

+0

@Richard Szalay dostaje odpowiedź, ponieważ wiem, że najpierw zamieścił rozwiązanie. –

17
double progressRatio = progressTimeSpan.Ticks/(double)totalTimeSpan.Ticks; 

Musisz rzucić jedną do podwójnej, w przeciwnym razie C# zrobi podział całkowity. Kleszcze są lepsze niż TotalMilliseconds, ponieważ tak to jest przechowywane i unika się jakiejkolwiek konwersji.

+0

+1 do konwersji. –

+0

@JDunkerley: Problem z konwersją jest nieistotny: nazywasz 'Ticks', a następnie przekształcasz się w' double'. Wywołanie "TotalMilliseconds" oznacza po prostu, że konwersja do 'double' jest wykonywana w ramach metody. 'Ticks' ma większą dokładność niż' TotalMilliseconds', i to często dobry powód, aby go użyć, ale prawie nieistotne w tym przypadku, gdy obliczamy tylko współczynnik. – LukeH

+0

Miałem na myśli, że TimeSpan jest przechowywany w kleszczach i musiałby zostać przekonwertowany na MilliSeconds zanim zostanie zwrócony do funkcji. Wprawdzie jest to bardzo szybka operacja, a koszt tego obliczenia jest w zasadzie zerowy, ale bardziej efektywny jest podział Tick niż konwersja do ms i ich dzielenie. – JDunkerley

0

TimeSpan zyskał kilka nowych operatorów z wydaniem .NET 2.0 Rdzeń:

public TimeSpan Divide(double divisor); 
public double Divide(TimeSpan ts); 
public TimeSpan Multiply(double factor); 

public static TimeSpan operator /(TimeSpan timeSpan, double divisor); 
public static double operator /(TimeSpan t1, TimeSpan t2); 
public static TimeSpan operator *(double factor, TimeSpan timeSpan); 
public static TimeSpan operator *(TimeSpan timeSpan, double factor); 

części banknotu TimeSpan mogą teraz zostać podzielona przez inną TimeSpan:

var a = new TimeSpan(10, 0, 0); 
var b = new TimeSpan(0, 30, 0); 
var c = new TimeSpan(0, 4, 30); 

Console.WriteLine(a/b); 
// Displays: "20" 

Console.WriteLine(b/c); 
// Displays: "6.66666666666667" 
Powiązane problemy