Умножить TimeSpan в .NET.

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

duration*5

Но это дает мне ошибку "оператор * не может применяться к типам TimeSpan и int". Здесь мое текущее обходное решение

duration+duration+duration+duration+duration

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

Ответ 1

Из этой статьи

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

Ответ 2

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

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 секунд.

Ответ 3

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

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

Ответ 4

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

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

Ответ 6

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

Ответ 7

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

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