Comment multiplier un objet TimeSpan en C #? En supposant que la variable duration
est un TimeSpan , je voudrais, par exemple
duration*5
Mais cela me donne une erreur "opérateur * ne peut pas être appliqué aux types TimeSpan et int". Voici ma solution de contournement actuelle
duration+duration+duration+duration+duration
Mais cela ne s'étend pas aux multiples non entiers, par exemple. duration * 3.5
Réponses:
De cet article
TimeSpan duration = TimeSpan.FromMinutes(1); duration = TimeSpan.FromTicks(duration.Ticks * 12); Console.WriteLine(duration);
la source
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Pour ceux qui souhaitent copier et coller:
namespace Utility { public static class TimeSpanExtension { /// <summary> /// Multiplies a timespan by an integer value /// </summary> public static TimeSpan Multiply(this TimeSpan multiplicand, int multiplier) { return TimeSpan.FromTicks(multiplicand.Ticks * multiplier); } /// <summary> /// Multiplies a timespan by a double value /// </summary> public static TimeSpan Multiply(this TimeSpan multiplicand, double multiplier) { return TimeSpan.FromTicks((long)(multiplicand.Ticks * multiplier)); } } }
Exemple d'utilisation:
using Utility; private static void Example() { TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); }
t
se terminera en 150 secondes.la source
La
TimeSpan
structure n'entraîne pas de surcharge pour l'*
opérateur, vous devez donc le faire vous-même:var result = TimeSpan.FromTicks(duration.Ticks * 5);
la source
TimeSpan.Multiply
est arrivé dans .NET Core et semble arriver dans .NET Standard 2.1:https://docs.microsoft.com/en-us/dotnet/api/system.timespan.op_multiply?view=netstandard-2.1
var result = 3.0 * TimeSpan.FromSeconds(3);
la source
Vous pouvez utiliser les données internes de TimeSpan, à savoir les ticks.
TimeSpan day = TimeSpan.FromDays(1); TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
la source
Utilisez des tiques:
http://www.personal.psu.edu/wbk2/blogs/personal_blog/dotnet-stuff-timespan-multiplication-and-division.html
la source
Multiply est maintenant disponible pour TimeSpan !!!
Mais uniquement pour .NET Core et .NET Standard .
Depuis .NET Core 2.0 (ou .NET Standard 2.1 ), vous pouvez exécuter avec succès le code suivant:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3); // Prints: // 00:02:15
Limites
Néanmoins, il est important de noter ( comme décrit dans le document ) que cela s'applique uniquement à .NET Core 2.0 + et .NET Standard 2.1 +.
À partir d'aujourd'hui (26 novembre 2019), le code ci-dessus échouera même dans la dernière version de .NET Framework : 4.8 .
Si vous essayez le code ci-dessus dans une application de console , par exemple, exécutant .NET Core 1.1 ou inférieur, ou .NET Framework 4.8 ou inférieur, vous serez renvoyé l'exception suivante:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''
Pourquoi pas dans .NET Framework?
Afin de comprendre pourquoi diable nous ne pouvons pas utiliser le code ci-dessus dans .NET Framework, il est instructif de voir ce que dit Immo :
la source
Vous devez spécifier quel membre vous voulez multiplier par 5 ->
TimeSpan.TotalMinutes * 5
la source
T * 5
devrait aussi multiplier les heures et les secondes.TotalMinutes
est la durée totale de l'intervalle de temps exprimée en minutes, donc si l'intervalle de temps représente une heure et 10 minutes et 30 secondes, TotalMinutes renverrait 70,5.TotalMinutes
propriété est un double donnant le nombre total de minutes de tout le TimeSpan, en tenant compte de tous les autres champs. Cette solution fonctionne de la même manière bienTicks
qu'elle semble être une approche plus agréable. Mais tenez compte du fait que les ticks devront plus tard être transformés en minutes si vous souhaitez montrer à l'utilisateur des informations qui ont du sens.Le problème ici est que vous souhaitez multiplier la durée. La solution de contournement la plus simple consiste à utiliser des graduations. par exemple.
var ticks = TimeSpan.FromMinutes(1).Ticks; var newTimeSpan = TimeSpan.FromTicks(ticks*5);
la source