Summe der Zeitspannen in C #
Habe ich eine Sammlung von Objekten gehören, die einen TimeSpan-variable:
MyObject
{
TimeSpan TheDuration { get; set; }
}
Möchte ich LINQ, um die Summe dieser Zeiten.
Natürlich, (von r in MyCollection wählen Sie r.TheDuration).Summe(); funktioniert nicht!
Ich überlege, ändern Sie den Datentyp TheDuration ein int und dann addieren und die Umwandlung der Summe zu einer Zeitspanne. Das wird chaotisch, weil jeder TheDuration in meiner Sammlung verwendet wird, als eine Zeitspanne irgendwo sonst.
Jeder Vorschlag, auf diese Summe?
InformationsquelleAutor der Frage frenchie | 2011-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider gibt es nicht eine überlastung der
Sum
nimmt eineIEnumerable<TimeSpan>
. Zudem gibt es keine aktuellen Art und Weise der Angabe der operator-basierte generische constraints für Typ-Parameter, so dass, obwohlTimeSpan
ist "nativ" summierbare, dass Tatsache, die abgeholt werden können nicht einfach durch generischen code.Eine option wäre, wie du sagst, die Summe einem integral-Typ entspricht der Zeitspanne statt, und drehen Sie dann , dass Summe in ein
TimeSpan
wieder. Die ideale Immobilie für diese istTimeSpan.Zecken
, die round-trips genau. Aber es ist nicht notwendig, um die Eigenschaft zu ändern-type-in Ihrer Klasse bei allen; können Sie nur Projekt:Alternativ, wenn Sie wollen, zu bleiben, um die Zeitspanne ist
+
Betreiber zu tun, die Summen, die Sie verwenden können, dieAggregate
Betreiber:InformationsquelleAutor der Antwort Ani
Diese gut funktioniert (code basierend auf Ani ' s Antwort)
Verwendung :
Wenn Perioden ist eine Liste von Objekten mit einem Duration-Eigenschaft
InformationsquelleAutor der Antwort grantnz
Lege ich diese in einer Klasse eine Erweiterung hinzufügen-Methode, um eine Sammlung von Zeitspannen:
So, jetzt kann ich schreiben TotalDuration = (meine LINQ-Abfrage, gibt eine Sammlung von timespan).TotalTime();
Voila!
InformationsquelleAutor der Antwort frenchie
Können Sie
.Aggregate
eher als.Sum
, und übergeben Sie ein timespan-Summen-Funktion, die Sie schreiben, wie diese:InformationsquelleAutor der Antwort CesarGon
Hier ist, was ich versucht und es funktionierte:
InformationsquelleAutor der Antwort Shekhar_Pro
Ich glaube, das ist die sauberste LINQ-extension:
Benutzung ist die gleiche:
InformationsquelleAutor der Antwort Matt Williams
Dies funktioniert sowohl für eine Sammlung, und eine Eigenschaft in einer Sammlung;
InformationsquelleAutor der Antwort wonea