2012-03-28 21 views
56

¿Cómo multiplico un objeto TimeSpan en C#? Suponiendo que la variable duration es un TimeSpan, me gustaría, por ejemploMultiplica TimeSpan en .NET

duration*5 

Pero eso me da un error "operador * no se puede aplicar a tipos TimeSpan e int". Aquí está mi solución actual

duration+duration+duration+duration+duration 

Pero esto no se extiende a múltiplos no enteros, por ejemplo. duration * 3.5

+3

Este es un requisito realmente obvio y simple de implementar. Me pregunto por qué MS no pensó en incluir multiplicación y división como operadores estándar. – Andy

Respuesta

71

From this article

TimeSpan duration = TimeSpan.FromMinutes(1); 
duration = TimeSpan.FromTicks(duration.Ticks * 12); 
Console.WriteLine(duration);  
+4

Gracias he usado 'TimeSpan.FromTicks ((largo) (duración.Ticks * multiplicador))' –

+2

Prefiero usar métodos de extensión. Como sugirió Stephen Hewlett en sus respuestas a esta pregunta. –

+8

@MikedeKlerk De acuerdo, pero eso es azúcar más sintáctica. El OP todavía necesita saber la raíz de la respuesta para que se pueda aplicar dentro de cualquier método, extensión o no –

1

es necesario especificar qué miembro se desea multiplicar por 5 ->TimeSpan.TotalMinutes * 5

+1

Esto funciona, pero una solución general más agradable es multiplicar los ticks en mi humilde opinión. –

+1

No, un TimeSpan es un escalar. 'T * 5' debe multiplicar las horas y los segundos también. –

+1

@HenkHolterman pero 'TotalMinutes' es la duración total del intervalo de tiempo expresado en minutos, por lo que si el intervalo de tiempo representa una hora y 10 minutos y 30 segundos, TotalMinutes devolvería 70.5. – phoog

10

La estructura TimeSpan no proporciona una sobrecarga para el operador *, por lo que tiene para hacerlo usted mismo:

var result = TimeSpan.FromTicks(duration.Ticks * 5); 
4

Puede utilizar los datos internos de TimeSpan, a saber, las garrapatas.

TimeSpan day = TimeSpan.FromDays(1); 
TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7); 
1

El problema aquí es que quiere multiplicar el intervalo de tiempo. La solución más simple es usar ticks. p.ej.

var ticks = TimeSpan.FromMinutes(1).Ticks; 
var newTimeSpan = TimeSpan.FromTicks(ticks*5); 
33

Para aquellos que deseen copiar y pegar:

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

Ejemplo de Uso:

using Utility; 

private static void Example() 
{ 
    TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); 
} 

t va a terminar como 150 segundos.

+0

Los métodos de extensión son la solución más conveniente para este tipo de problemas. –

+0

El parámetro multiplicador podría tener un tipo largo sin costos adicionales. – tm1