簡體   English   中英

如何在不循環的情況下使用System.TimeSpan值實現模數運算?

[英]How can I achieve a modulus operation with System.TimeSpan values, without looping?

我在我的代碼(C#/ WPF)中對性能非常敏感的部分,我需要以盡可能最快的方式在兩個System.TimeSpan值之間執行模數運算。

這段代碼每秒運行數千次,我更傾向於避免使用手動循環計算 - 不惜一切代價。

兩個TimeSpans之間的模數的想法可能看起來有點奇怪,所以請允許我解釋 -
說我們有
TimeSpan A = 1分30秒
TimeSpan B = 20秒

以下是常見操作列表及其合理結果:

A + B =(TimeSpan)1分50秒

A - B =(TimeSpan)1分10秒

A * B =沒有合理的計算方法
multiply a TimeSpan by an integer. 我們將TimeSpan乘以整數。 A * 5 =(TimeSpan)7分30秒
Microsoft尚未在TimeSpans和整數之間實現乘法。

A / B =(int)4或(double)4.5
此操作不是直接在.NET框架中實現的,但它非常有意義。
A中有4.5個B.(4.5 * 20 = 90)

A%B =(TimeSpan)10秒
給定合理的TimeSpan除法,TimeSpan模數應該非常簡單。
equals (int)4 (TimeSpan)10 Seconds. A / B 等於(int)4 (TimeSpan)10秒。 商和余數是不同的數據類型,這實際上可能是微軟沒有直接實現這一點的原因。

我需要找到一種有效的方法來計算它而不需要循環。 通常我不會反對短循環,但這些TimeSpans可能會有很大不同。 TimeSpans之間的指數差異越大,商數越大。 商數越大,“分頻循環”必須執行的迭代次數越多。 這是我在應用程序的這一部分中不允許的依賴項。

SO有什么想法嗎?

乘法很容易:

TimeSpan a5 = TimeSpan.FromTicks(A.Ticks * 5);

同樣A / B:

double aOverB = (double)A.Ticks / B.Ticks;

和A%B:

TimeSpan aModB = TimeSpan.FromTicks(A.Ticks % B.Ticks);

示范:

using System;

class Test
{
    static void Main()
    {
        TimeSpan a = TimeSpan.FromSeconds(90);
        TimeSpan b = TimeSpan.FromSeconds(20);

        TimeSpan a5 = TimeSpan.FromTicks(a.Ticks * 5);
        double aOverB = (double)a.Ticks / b.Ticks;
        TimeSpan aModB = TimeSpan.FromTicks(a.Ticks % b.Ticks);

        Console.WriteLine(a5);
        Console.WriteLine(aOverB);
        Console.WriteLine(aModB);
    }
}

輸出:

00:07:30
4.5
00:00:10

會是這樣的

new TimeSpan( A.Ticks % B.Ticks))

給你想要的結果? Ticks是否是正確的工作單位? 也許你需要將跨度轉換為秒或毫秒或其他東西。 我不知道你的申請是什么。

如果您可以將時間跨度轉換為它所代表的秒數,則可以修改這些值然后轉換回來。

我不會直接使用timespan對象來執行此操作,而是使用ticks功能。

像這樣的東西。

TimeSpan oSpan = new TimeSpan(0, 1, 20, 0, 0);
TimeSpan oShort = new TimeSpan(0, 0, 20, 0, 0);
long modRemainder = oSpan.Ticks % oShort.Ticks;
TimeSpan oRemainderSpan = new TimeSpan(modRemainder);

你可以將它壓縮成一步,但我這樣做是為了說明。 它使您可以輕松地進行任何您想要的數學運算。

我能想到的最好的方法是使用TotalSeconds屬性並對其進行模數化。 但是,它們是Double,允許小數值,因此可能無法達到您要求的確切值。 你可以隨時獲得整個部分並模數,但是因為你擔心速度,我擔心這對於每秒必須運行數百次的操作來說可能太慢了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM