9
votes

Quelle est la meilleure façon de diviser deux objets de l'aéronautique?

Je veux obtenir le rapport entre une seule pion contre un autre tiers (essentiellement, le progrès d'une vidéo de lecture de son temps total). Mes méthodes actuelles consistent à obtenir les millisecondes des deux objets de l'aéronautique et de diviser une contre l'autre. Quelque chose comme: xxx

y a-t-il un itinéraire plus direct? C'est un problème simple et je suis juste curieux s'il y a un moyen super élégant de le résoudre.

acclamer tout James

c#

0 commentaires

4 Réponses :


16
votes

Vous devez utiliser Ticks ou TotalMilliseconds , en fonction de la précision requise . millisecondes est le nombre de millisecondes après la deuxième courant.

Quant à une meilleure solution, cela ne gagne pas plus simple qu'une division afin que votre solution actuelle soit bien (moins le bogue).


1 commentaires

@Richard Szalay obtient la réponse car je sais qu'il a publié la solution en premier.



19
votes
double progressRatio = progressTimeSpan.Ticks / (double)totalTimeSpan.Ticks;
You must cast one to a double, otherwise C# will do integer division. Ticks is better than the TotalMilliseconds because that is how it is stored and avoids any conversion.

3 commentaires

@JDUNKERLEY: Le problème de conversion est hors de propos: vous appelez ticks puis convertissant en double vous-même. Calling TotalMilliseconds signifie simplement que la conversion vers double est effectuée 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 plutôt sans pertinence dans ce cas où nous calculons simplement un ratio.


Je voulais dire que la période de temps est stockée dans des tiques et devra d'abord être convertie en millisecondes avant d'être renvoyée à la fonction. Certes, il s'agit d'une opération très rapide et le coût de ce calcul est fondamentalement zéro, mais il est plus efficace de diviser la coche plutôt que de la convertir à la SEP et de les diviser.


@JDUNKERLEY: Je viens de courir des points de repère rapide ici et il y a aucune différence mesurable sur tout entre les deux techniques. Ils gèrent tous deux environ 25 millions d'itérations par seconde et ils sont toujours au cou et au cou même après avoir couru des dizaines de milliards d'itérations.



2
votes

tispan code> a gagné plusieurs nouveaux opérateurs avec la libération de .NET CORE 2.0 FORT>:

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"


1 commentaires

Dommage que ce ne soit pas encore disponible dans la norme .NET.



0
votes

Utiliser la méthode de l'extension peut rendre des codes plus lisibles.

public static double DividedBy(this TimeSpan x, TimeSpan y)
{
    return Convert.ToDouble(x.Ticks) / y.Ticks;
}


0 commentaires