2017-07-20 2 views
1

Ich versuche einige TimeSpans für einige Berechnungen zusammen hinzuzufügen.
zB:Überprüfen Sie, ob das Hinzufügen von TimeSpans TimeSpan.MaxValue

var timeSpan1 = new TimeSpan.FromMinutes(1); 
var timeSpan2 = new TimeSpan.MaxValue; 
var timeSpan3 = timeSpan1 + timeSpan2; 

In diesem Fall wird es die TimeSpan.MaxValue überschreiten und eine Ausnahme

System.OverflowException werfen: Timespan überschwemmt, da die Dauer zu lang ist.

Was ist der richtige Weg, um TimeSpans hinzuzufügen?

Muss ich einen Try-Catch um mich legen oder meine eigene Erweiterungsmethode schreiben? Scheint so, als ob dies Teil des .Net-Frameworks sein sollte - entweder standardmäßig auf MaxValue oder eine TryAdd-Methode.

+0

Warum denken Sie, dass das Auslösen einer Ausnahme nicht das richtige Verhalten ist? Wenn "timeSpan3" in "TimeSpan.MaxValue" resultieren würde, würdest du die Regeln der Mathematik so brechen, dass "timeSpan3 - timeSpan1! = TimeSpan2". –

+0

@MattJohnson Guter Punkt! Mein Anwendungsfall für MaxValue ist jedoch "unendlich". Also "unendlich + unendlich = unendlich". In diesem Fall sollte ich auch nicht 'infinity - timepan = ... 'verwenden und auf das Ergebnis vertrauen. – JumpingJezza

Antwort

2

Ich würde Algebra verwenden, und halten alles in den TimeSpan Einheiten:

public static TimeSpan AddTimeSpan(this TimeSpan ts1, TimeSpan ts2) 
{ 
    bool sign1 = ts1 < TimeSpan.Zero, sign2 = ts2 < TimeSpan.Zero; 

    if (sign1 && sign2) 
    { 
     if (TimeSpan.MinValue - ts1 > ts2) 
     { 
      return TimeSpan.MinValue; 
     } 
    } 
    else if (!sign1 && !sign2) 
    { 
     if (TimeSpan.MaxValue - ts1 < ts2) 
     { 
      return TimeSpan.MaxValue; 
     } 
    } 

    return ts1 + ts2; 
} 

Auf diese Weise können Sie TimeSpan nutzen, ohne dass es an andere Geräte konvertieren, und Sie können sicher sein, dass die Addition unabhängig von anderen potenziellen Fehlern funktioniert, die während der Konvertierung auftreten könnten (ich denke, es ist davon auszugehen, dass der Bereich TimeSpan sich nicht so ändert, dass die TotalMinutes nicht mehr länger gültig ist reicht aus, aber Sie könnten beim genauen Additionsergebnis eine gewisse Ungenauigkeit feststellen, wenn Sie sich dem Grenzwert von TimeSpan.MinValue oder TimeSpan.MaxValue nähern).

+0

Ich landete zurück zu Ticks verwenden. Der Performance-Hit beim Vergleich von TimeSpans, die diese Methode 3 oder 4 Millionen Mal aufgerufen haben, war zu viel – JumpingJezza

0

Ich schrieb eine Erweiterungs-Methode für TimeSpan. Wird auch benötigt, um nach TimeSpan.MinValue zu suchen, da Sie negative Zahlen hinzufügen können. Ich fing an, die Ticks für die TimeSpans zu überprüfen, aber ich bekam einige seltsame Ergebnisse. Anscheinend TimeSpan.MinValue.Ticks + TimeSpan.MinValue.Ticks = 2?

Also statt:

public static TimeSpan AddTimeSpan(this TimeSpan firstTimeSpan, TimeSpan secondTimeSpan) 
{ 
    if (firstTimeSpan.TotalMinutes + secondTimeSpan.TotalMinutes > TimeSpan.MaxValue.TotalMinutes) 
    { 
     return TimeSpan.MaxValue; 
    } 
    if (firstTimeSpan.TotalMinutes + secondTimeSpan.TotalMinutes < TimeSpan.MinValue.TotalMinutes) 
    { 
     return TimeSpan.MinValue; 
    } 
    return firstTimeSpan + secondTimeSpan; 
} 
+1

können Sie überprüfen, die Referenzquelle für Hinweise https://referencesource.microsoft.com/#mscorlib/system/timespan.cs574ccdd4f806977f scheint die Zeichen Bits der Ticks zu vergleichen – Slai

Verwandte Themen