2009-09-10 11 views
8

Je veux obtenir le rapport d'un TimeSpan à un autre TimeSpan (essentiellement la progression d'une vidéo en cours de lecture à partir de son temps total). Mes méthodes actuelles sont d'obtenir les millisecondes des deux objets TimeSpan et de les diviser l'un contre l'autre. Quelque chose comme:Quelle est la meilleure façon de diviser deux objets TimeSpan?

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

     Double progressRatio = progressInMilliseconds/durationInMilliseconds; 

Y a-t-il une route plus directe? C'est un problème simple et je suis juste curieux de savoir s'il y a une manière super élégante de le résoudre.

Vive tous James

Répondre

16

Vous devez utiliser soit Ticks ou TotalMilliseconds, en fonction de la précision requise. Milliseconds est le nombre de millisecondes après la seconde en cours.

Comme pour une meilleure solution, il ne devient pas plus simple qu'une division de sorte que votre solution actuelle est bien (moins le bug).

+0

@Richard Szalay obtient la réponse comme je sais qu'il a posté la solution d'abord. –

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

Vous devez en lancer un à un double, sinon C# fera la division entière. Les ticks sont meilleurs que TotalMilliseconds parce que c'est ainsi qu'il est stocké et évite toute conversion.

+0

+1 pour la conversion. –

+0

@JDunkerley: Le problème de conversion n'est pas important: vous appelez 'Ticks' et vous convertissez en' double'. L'appel 'TotalMilliseconds' signifie simplement que la conversion' 'double'' est faite dans la méthode à la place. 'Ticks' a une plus grande précision que 'TotalMilliseconds', et c'est souvent une bonne raison de l'utiliser, mais pas du tout pertinent dans ce cas où nous sommes en train de calculer un ratio. – LukeH

+0

Je voulais dire que le TimeSpan est stocké dans Ticks et devrait d'abord être converti en MilliSeconds avant d'être retourné à la fonction. Certes, il s'agit d'une opération très rapide et le coût de ce calcul est fondamentalement nul, mais il est plus efficace de diviser la Tick plutôt que de la convertir en ms et de la diviser. – JDunkerley

0

TimeSpan a enregistré plusieurs nouveaux opérateurs avec la sortie de .NET Core 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); 

à noter, un TimeSpan peut maintenant être divisé par un autre 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" 
Questions connexes