2009-09-10 3 views
8

Я хочу получить отношение одного TimeSpan к другому TimeSpan (В основном, ход воспроизведения видео из его общего времени). Мои текущие методы - получить миллисекунды двух объектов TimeSpan и разделить один на другой. Что-то вроде:Каков наилучший способ разделить два объекта TimeSpan?

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

     Double progressRatio = progressInMilliseconds/durationInMilliseconds; 

Есть ли более прямой маршрут? Это простая проблема, и мне просто интересно, есть ли великолепный способ ее решения.

Приветствие всех Джеймс

ответ

16

Вы должны использовать либо Ticks или TotalMilliseconds, в зависимости от требуемой точности. Milliseconds - это количество миллисекунд, прошедших текущую секунду.

Что касается лучшего решения, оно не упрощается, чем разделение, поэтому ваше текущее решение в порядке (минус ошибка).

+0

@Richard Салаи получает ответ, поскольку я знаю, что он опубликовал решение в первую очередь. –

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

Вы должны наложить один на двойной, иначе C# будет выполнять целочисленное деление. Клещи лучше, чем TotalMilliseconds, потому что он хранится и избегает любого преобразования.

+0

+1 для преобразования. –

+0

@JDunkerley: проблема преобразования не имеет значения: вы вызываете 'Ticks', а затем конвертируете в' double' самостоятельно. Вызов 'TotalMilliseconds' означает, что вместо этого выполняется преобразование в' double' внутри метода. «Ticks» имеет большую точность, чем «TotalMilliseconds», и это часто является хорошей причиной для его использования, но в значительной степени нерелевантно в этом случае, когда мы просто вычисляем коэффициент. – LukeH

+0

Я имел в виду, что TimeSpan хранится в Ticks и сначала нужно будет преобразовать в MilliSeconds, прежде чем вернуться к функции. По общему признанию, это очень быстрая операция, и стоимость этого вычисления в основном равна нулю, но более эффективно делить Tick, а не конвертировать в ms и делить их. – JDunkerley

0

TimeSpan получил несколько новых операторов с выпуском .NET Ядра 2.0:

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); 

Of ноты, TimeSpan теперь можно разделить на другой 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"