501 Stimmen

Äquivalent von Math.Min & Math.Max für Daten?

Wie kann ich am schnellsten und einfachsten den Minimalwert (oder Maximalwert) zwischen zwei Daten ermitteln? Gibt es eine Entsprechung zu Math.Min (& Math.Max) für Datumsangaben?

Ich möchte etwas tun wie:

 if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
      //not allowed to do this
 }

Offensichtlich funktioniert die obige Math.Min nicht, weil es sich um Datumsangaben handelt.

657voto

mmx Punkte 400975

Es gibt keine eingebaute Methode, um das zu tun. Sie können den Ausdruck verwenden:

(date1 > date2 ? date1 : date2)

um das Maximum der beiden zu finden.

Sie können eine generische Methode schreiben, um zu berechnen Min o Max für jeden Typ (vorausgesetzt, dass Comparer<T>.Default entsprechend eingestellt ist):

public static T Max<T>(T first, T second) {
    if (Comparer<T>.Default.Compare(first, second) > 0)
        return first;
    return second;
}

Sie können auch LINQ verwenden:

new[]{date1, date2, date3}.Max()

509voto

Guffa Punkte 663241

Es gibt keine Überladung für DateTime-Werte, aber Sie können den langen Wert erhalten Ticks das heißt, was die Werte enthalten, vergleichen sie und erstellen dann einen neuen DateTime-Wert aus dem Ergebnis:

new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))

(Beachten Sie, dass die DateTime-Struktur auch eine Kind Eigenschaft, die nicht in den neuen Wert übernommen wird. Dies ist normalerweise kein Problem; wenn Sie DateTime-Werte unterschiedlicher Art vergleichen, macht der Vergleich ohnehin keinen Sinn).

61voto

Toshi Punkte 2321

Linq.Min() / Linq.Max() Ansatz:

DateTime date1 = new DateTime(2000,1,1);
DateTime date2 = new DateTime(2001,1,1);

DateTime minresult = new[] { date1,date2 }.Min();
DateTime maxresult = new[] { date1,date2 }.Max();

42voto

Marc Gravell Punkte 970173

Wie wäre es damit:

public static T Min<T>(params T[] values)
{
    if (values == null) throw new ArgumentNullException("values");
    var comparer = Comparer<T>.Default;
    switch(values.Length) {
        case 0: throw new ArgumentException();
        case 1: return values[0];
        case 2: return comparer.Compare(values[0],values[1]) < 0
               ? values[0] : values[1];
        default:
            T best = values[0];
            for (int i = 1; i < values.Length; i++)
            {
                if (comparer.Compare(values[i], best) < 0)
                {
                    best = values[i];
                }
            }
            return best;
    }        
}
// overload for the common "2" case...
public static T Min<T>(T x, T y)
{
    return Comparer<T>.Default.Compare(x, y) < 0 ? x : y;
}

Funktioniert mit jedem Typ, der Folgendes unterstützt IComparable<T> o IComparable .

Eigentlich mit LINQ, eine andere Alternative ist:

var min = new[] {x,y,z}.Min();

30voto

R. Salisbury Punkte 1800

Wenn Sie verwenden möchten, verwenden Sie Linq.Max() ), sondern nennen Sie es eher so Math.Max können Sie so etwas wie diesen sehr kurzen Ausdruck Körper zu tun:

public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X