2009-09-10 121 views
8

我想获得一个TimeSpan与另一个TimeSpan的比率(基本上是从总时间中播放视频的进度)。我目前的方法是获取两个TimeSpan对象的毫秒数并将一个对另一个进行分割。例如:划分两个TimeSpan对象的最佳方式是什么?

 int durationInMilliseconds = totalTimeSpan.Milliseconds; 
     int progressInMilliseconds = progressTimeSpan.Milliseconds; 

     Double progressRatio = progressInMilliseconds/durationInMilliseconds; 

是否有更直接的路线?这是一个简单的问题,我只是好奇,如果有一个超级优雅的方式来解决它。

干杯所有 詹姆斯

回答

16

您应该使用TicksTotalMilliseconds,根据所需的精度。 Milliseconds是当前秒数的毫秒数。

至于更好的解决方案,它没有什么比一个师简单所以你当前的解决方案是好的(减去的bug)。

+0

@Richard绍洛伊得到正如我所知,他首先发布了解决方案。 – 2009-09-10 15:04:10

17
double progressRatio = progressTimeSpan.Ticks/(double)totalTimeSpan.Ticks; 

您必须投一个到一个double,否则C#将做整数除法。 Ticks比TotalMilliseconds更好,因为它是如何存储并避免任何转换的。

+0

+1进行转换。 – 2009-09-10 14:09:39

+0

@JDunkerley:转换问题无关紧要:您正在调用'Ticks',然后自己转换为'double'。调用'TotalMilliseconds'只是意味着在方法内完成到'double'的转换。 'Ticks'比'TotalMilliseconds'具有更高的准确性,这通常是使用它的一个很好的理由,但在这种情况下,我们只是在计算一个比率。 – LukeH 2009-09-10 14:36:18

+0

我的意思是TimeSpan存储在Ticks中,并且在返回到函数之前需要先转换为MilliSeconds。无可否认,这是一个非常快速的操作,计算成本基本为零,但将Tick划分而不是转换为MS并划分它们会更有效。 – JDunkerley 2009-09-10 14:40:15

0

TimeSpan获得了几个新的运营商.NET核2.0发布:

public TimeSpan Divide(double divisor); 
public double Divide(TimeSpan ts); 
public TimeSpan Multiply(double factor); 

public static TimeSpan operator /(TimeSpan timeSpan, double divisor); 
public static double operator /(TimeSpan t1, TimeSpan t2); 
public static TimeSpan operator *(double factor, TimeSpan timeSpan); 
public static TimeSpan operator *(TimeSpan timeSpan, double factor); 

值得注意的是,一个TimeSpan现在可以通过另一种TimeSpan分为:

var a = new TimeSpan(10, 0, 0); 
var b = new TimeSpan(0, 30, 0); 
var c = new TimeSpan(0, 4, 30); 

Console.WriteLine(a/b); 
// Displays: "20" 

Console.WriteLine(b/c); 
// Displays: "6.66666666666667" 
相关问题