C#でTimeSpanオブジェクトを乗算するにはどうすればよいですか?変数duration
がTimeSpanであると仮定すると、たとえば、
duration*5
しかし、「演算子*はTimeSpan型とint型には適用できません」というエラーが表示されます。これが私の現在の回避策です
duration+duration+duration+duration+duration
しかし、これは非整数倍数には拡張されません。 duration * 3.5
C#でTimeSpanオブジェクトを乗算するにはどうすればよいですか?変数duration
がTimeSpanであると仮定すると、たとえば、
duration*5
しかし、「演算子*はTimeSpan型とint型には適用できません」というエラーが表示されます。これが私の現在の回避策です
duration+duration+duration+duration+duration
しかし、これは非整数倍数には拡張されません。 duration * 3.5
回答:
TimeSpan duration = TimeSpan.FromMinutes(1);
duration = TimeSpan.FromTicks(duration.Ticks * 12);
Console.WriteLine(duration);
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
コピーして貼り付けたい場合:
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秒になります。
TimeSpan.Multiply
.NET Coreに到着し、.NET Standard2.1に到着するようです。
https://docs.microsoft.com/en-us/dotnet/api/system.timespan.op_multiply?view=netstandard-2.1
var result = 3.0 * TimeSpan.FromSeconds(3);
ただし、.NETCoreおよび.NETStandardの場合のみ。
.NET Core 2.0(または.NET Standard 2.1)以降、次のコードを正常に実行できます。
Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15
それにもかかわらず、(注目することが重要であるドキュメンタリーに記載されているように、これは唯一のために適用されること).NETコア2.0 +、および.NET標準2.1 +。
本日(2019年11月26日)の時点で、上記のコードは最新の.NETFrameworkバージョン4.8でも失敗します。
たとえば、.NET Core1.1以下または.NETFramework 4.8以下を実行しているコンソールアプリケーションで上記のコードを試してみると、次の例外がスローされます。
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:
'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''
いったいなぜ.NETFrameworkで上記のコードを使用できないのかを理解するために、Immoの言うことを理解することは啓発的です。
.NET Coreは、オープンソースでクロスプラットフォームの動きの速いバージョンの.NETです。サイドバイサイドであるため、.NETFrameworkに適用するリスクを冒すことのできない変更を加えることができます。これは、.NET Coreが、.NETFrameworkでは取得できない新しいAPIと言語機能を徐々に取得することを意味します。ビルドでは、.NETCoreでファイルAPIがどのように高速になるかをデモで示しました。同じ変更を.NETFrameworkに適用すると、既存のアプリケーションが破損する可能性がありますが、それは望ましくありません。
5を掛けるメンバーを指定する必要があります-> TimeSpan.TotalMinutes * 5
T * 5
時間と秒も掛ける必要があります。
TotalMinutes
、これは分で表されるタイムスパンの合計期間であるため、タイムスパンが1時間10分30秒を表す場合、TotalMinutesは70.5を返します。
TotalMinutes
プロパティはDoubleであり、他のすべてのフィールドを考慮に入れて、TimeSpan全体の合計分数を示します。このソリューションは同じ Ticks
ように機能しますが、より良いアプローチのように見えます。ただし、意味のある情報をユーザーに表示する場合は、後でティックを分に変換する必要があることを考慮してください。