2012-03-28 3 views
56

Как я могу умножить объект TimeSpan на C#? Предположив, что переменная duration является TimeSpan, я хотел бы, напримерУмножить TimeSpan в .NET

duration*5 

Но это дает мне ошибку «оператор * не может быть применен к типам TimeSpan и междунар». Вот мой текущий обход

duration+duration+duration+duration+duration 

Но это не распространяется на нецелые кратные, например. duration * 3.5

+3

Это действительно очевидное требование и прост в реализации. Интересно, почему MS не думала включать в себя многократные и разделить как стандартные операторы? – Andy

ответ

71

From this article

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

Спасибо, я использовал 'TimeSpan.FromTicks ((long) (duration.Ticks * multiplier))' –

+2

Я предпочел бы использовать методы расширения. Как предложил Стивен Хьюлетт в ответах на этот вопрос. –

+8

@MikedeKlerk Согласовано, но это более синтаксический сахар. OP все еще должен знать корень ответа, чтобы его можно было применять внутри любого метода, расширения или нет. –

1

Вы должны указать, какой член именно вы хотите умножить на 5 ->TimeSpan.TotalMinutes * 5

+1

Это действительно работает - но более приятным решением является умножение тиков IMHO. –

+1

Нет, TimeSpan - это скаляр. 'T * 5' должен умножать часы и секунды. –

+1

@HenkHolterman, но «TotalMinutes» - это общая продолжительность периода времени, выраженная в минутах, поэтому, если период времени составляет час, а 10 минут и 30 секунд, TotalMinutes вернет 70.5. – phoog

10

TimeSpan структура не обеспечивает перегрузку оператора *, поэтому у вас есть для этого самостоятельно:

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

Вы можете использовать внутренние данные TimeSpan, а именно клещей.

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

Проблема заключается в том, что вы хотите умножить интервалы времени. Простейшим обходным путем является использование тиков. например.

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

Для тех, кто желает копировать и вставлять:

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

Пример:

using Utility; 

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

t будет в конечном итоге, как 150 секунд.

+0

Методы расширения - это наиболее удобное решение этих проблем. –

+0

Параметр множителя может иметь тип long без дополнительных затрат. – tm1

Смежные вопросы