.NET'te TimeSpan'ı çarpın


87

C # 'da bir TimeSpan nesnesini nasıl çarpabilirim? Değişkenin durationbir TimeSpan olduğunu varsayarsak, örneğin istiyorum

duration*5

Ama bu bana "operatör * TimeSpan ve int türlerine uygulanamaz" hatası veriyor. İşte şu anki çözümüm

duration+duration+duration+duration+duration

Ancak bu, tamsayı olmayan katlara uzanmaz, örn. duration * 3.5

Yanıtlar:


103

Bu makaleden

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

4
Teşekkürler kullandımTimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Albay Panic

2
Uzatma yöntemlerini kullanmayı tercih ederim. Stephen Hewlett'in bu soruya verdiği cevaplarda önerdiği gibi.
Mike de Klerk

11
@MikedeKlerk Katılıyorum, ancak bu daha çok sözdizimsel şeker. OP'nin, herhangi bir yöntemde, uzantılarda veya uygulamada uygulanabilmesi için cevabın kökenini hala bilmesi gerekiyor
Justin Pihony

2
İltifat için teşekkür ederim, ama @JustinPihony'nin benden yaklaşık iki yıl önce cevap verdiğini ve cevabındaki bilginin benim yazmamı sağladığını belirtmek zorunda hissediyorum.
Stephen Hewlett

45

Kopyalayıp yapıştırmak isteyenler için:

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

Örnek Kullanım:

using Utility;

private static void Example()
{
    TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5);
}

t 150 saniye olarak bitecek.


Uzatma yöntemleri, bu tür sorunlara en uygun çözümdür.
Mike de Klerk

Çarpan parametresi, ek maliyet olmaksızın uzun tipe sahip olabilir.
tm1

13

TimeSpanYapı için bir aşırı sağlamaz *, bu kendi başınıza yapmak zorunda, operatör:

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


5

TimeSpan'ın dahili verilerini, yani keneleri kullanabilirsiniz.

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

5

Multiply artık TimeSpan için kullanılabilir !!!

Ancak yalnızca .NET Core ve .NET Standard için .

Yana .NET Çekirdek 2.0 (veya .NET Standard 2.1 ) başarıyla aşağıdaki kodu çalıştırabilirsiniz:

Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15

Sınırlamalar

Bununla birlikte, bunun yalnızca .NET Core 2.0 + ve .NET Standard 2.1 + için geçerli olduğunu ( belgede açıklandığı gibi) not etmek önemlidir .

Bugün (26 Kasım 2019) itibarıyla yukarıdaki kod en son .NET Framework sürümünde bile başarısız olacaktır : 4.8 .

Yukarıdaki kodu bir Konsol uygulamasında denerseniz, örneğin .NET Core 1.1 veya altını veya .NET Framework 4.8 veya altını çalıştırırsanız, aşağıdaki istisna atılır:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator' * ',' System.TimeSpan 've' int '' türündeki işlenenlere uygulanamaz


Neden .NET Framework'te değil?

Biz .NET Framework yukarıdaki kodu neden kullanamazsınız yeryüzünde anlamak için, onu görmek için aydınlatmaktır neyi Immo diyor :

.NET Core , .NET'in açık kaynak, çapraz platform ve hızlı hareket eden sürümüdür. Yan yana doğası nedeniyle .NET Framework'e geri dönme riskini alamayacağımız değişiklikleri alabilir. Bu, .NET Core'un zamanla .NET Framework'ün alamayacağı yeni API'ler ve dil özellikleri alacağı anlamına gelir. Build'de dosya API'lerinin .NET Core'da nasıl daha hızlı olduğunu bir demo gösterdik. Aynı değişiklikleri .NET Framework'e koyarsak, mevcut uygulamaları bozabiliriz ve bunu yapmak istemeyiz.



2

5 ile çarpmak istediğiniz üyenin hangisi olduğunu belirtmeniz gerekiyor -> TimeSpan.TotalMinutes * 5


1
Bu işe yarıyor - ancak daha güzel bir genel çözüm, IMHO kenelerini çarpmaktır.
Rob Levine

1
Hayır, TimeSpan bir skalerdir. T * 5saatleri ve saniyeleri de çarpmalıdır.
Henk Holterman

1
@HenkHolterman ancak TotalMinutesdakika cinsinden ifade edilen zaman aralığının toplam süresidir, bu nedenle zaman aralığı bir saat 10 dakika ve 30 saniyeyi temsil ediyorsa, Toplam Dakika 70.5 döndürür.
phoog

1
@HenkHolterman phoog'un belirttiği gibi, TotalMinutesMülk, diğer tüm alanları hesaba katarak tüm TimeSpan'ın toplam dakika miktarını veren bir Çifttir . Bu çözüm, Ticksdaha hoş bir yaklaşım gibi görünse de aynı şekilde çalışır . Ancak, kullanıcıya mantıklı bazı bilgiler göstermek istiyorsanız, Kenelerin daha sonra dakikalara dönüştürülmesi gerekeceğini göz önünde bulundurun.
PedroC88

Kabul ettim, cümlenin ilk bölümüne tepki verdim. TotalMinutes gerçekten bir birleştirici üye değildir.
Henk Holterman

2

Buradaki sorun, zaman aralığını çarpmak istemenizdir. En basit çözüm, keneler kullanmaktır. Örneğin.

 var ticks = TimeSpan.FromMinutes(1).Ticks;
 var newTimeSpan = TimeSpan.FromTicks(ticks*5);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.