2009-09-10 18 views
8

Bir TimeSpan'ın başka bir TimeSpan'a oranını almak istiyorum (Temel olarak oynatılan videonun toplam süresinden başlaması). Şu anki yöntemlerim, iki TimeSpan nesnesinin milisaniyesini almak ve birini diğerine bölmek. İstediğiniz gibi bir şey var:İki TimeSpan nesnesini bölmenin en iyi yolu nedir?

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

     Double progressRatio = progressInMilliseconds/durationInMilliseconds; 

Daha direkt bir yol var mı? Bu basit bir problem ve bunu çözmek için süper zarif bir yol varsa merak ediyorum.

Cheers tüm James

cevap

16

Sen kullanması gerekir Ticks veya TotalMilliseconds, gerekli hassasiyet bağlı. Milliseconds, geçerli saniyeyi geçen milisaniye sayısıdır.

Daha iyi bir çözüm gelince, bir bölmeden daha basit olmaz, böylece mevcut çözümünüz iyidir (eksi hata).

+0

@Richard Szalay alır cevabını bildiğim gibi ilk önce çözümü yolladı. Dönüşüm için –

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

Birini bir ikiye bölmeniz gerekir, aksi halde C# tamsayı bölümü yapar. Keneler, TotalMilliseconds'dan daha iyidir, çünkü bu şekilde saklanır ve herhangi bir dönüşümden kaçınır.

+0

+1. –

+0

@JDunkerley: Dönüşüm sorunu alakasız: "Ticks" 'i çağırıyorsunuz ve sonra kendinize "çifte" çeviriyorsunuz. 'TotalMilliseconds' işlevini çağırmak, yalnızca 'double''a dönüştürme işleminin, bunun yerine yöntem içinde gerçekleştirildiği anlamına gelir. "Ticks", "TotalMilliseconds" değerinden daha büyük bir doğruluğa sahiptir ve bu, onu kullanmak için genellikle iyi bir nedendir, ancak yalnızca bir oran hesapladığımız bu durumda ilgisizdir. – LukeH

+0

TimeSpan'ın Ticks'de saklandığını ve ilk önce fonksiyona döndürülmeden önce MilliSeconds'a dönüştürülmesini istedim. Kuşkusuz bu çok hızlı bir işlemdir ve bu hesaplamanın maliyeti temel olarak sıfırdır, ancak ms'ye dönüştürmek ve bunları bölmek yerine Kene'yi bölmek daha verimlidir. – JDunkerley

0

TimeSpanNET Çekirdek 2.0 sürümü ile birkaç yeni operatörler kazanmıştır: Dikkat çekici

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

, bir TimeSpan şimdi başka TimeSpan tarafından ayrılabilir:

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" 
İlgili konular