Frage

Ich habe eine Liste, die Daten enthält:

List<string> StringDates;

    [0]: "04.03.2010"
    [1]: "09.03.2010"
    [2]: "11.03.2010"
    [3]: "12.03.2010"
    [4]: "16.03.2010"
    [5]: "18.03.2010"
    [6]: "19.03.2010"
    [7]: "23.03.2010"
    [8]: "25.03.2010"
    [9]: "26.03.2010"

C # Was ist der beste / kürzeste Weg min Datum, um herauszufinden / max stammt aus dieser Liste?

War es hilfreich?

Lösung

Ich mag die einfache Lösung.

DateTime minDate = DateTime.MaxValue;
DateTime maxDate = DateTime.MinValue;
foreach (string dateString in StringDates)
{
    DateTime date = DateTime.Parse(dateString);
    if (date < minDate)
        minDate = date;
    if (date > maxDate)
        maxDate = date;
}

Andere Tipps

Rechnen sie mit ParseExact (oder TryParseExact) DateTime und dann Linq verwenden, um die Min- und Max zu erhalten:

List<DateTime> dates = StringDates
   .Select(x => DateTime.ParseExact(x, "dd.MM.yyyy", null))
   .ToList();
DateTime minDate = dates.Min();
DateTime maxDate = dates.Max();

Beachten Sie, dass die Liste in Ihrem Beispiel bereits aufsteigend sortiert wurde. Wenn Sie garantieren können, dass dies immer der Fall sein wird, und Sie eine bessere Leistung wollen, könnten Sie nehmen nur das erste und das letzte Element, das O (1) anstelle von O sein würde (n). Aber die oben sicherer ist so, auch wenn Ihr wohl aufgelistet sind, werden immer sortiert werden, sollten Sie wahrscheinlich nicht diese Optimierung machen, wenn Sie es wirklich brauchen, nur für den Fall eines Tages die Liste nicht in sortierter Reihenfolge kommt.

Verwendung Linq:

    var list = new List<DateTime>();
    list.Add(new DateTime(2010, 1, 1));
    list.Add(new DateTime(2008, 1, 1));
    list.Add(new DateTime(2009, 1, 1));
    Console.WriteLine(list.Max(date => date));
    Console.WriteLine(list.Min(date => date));

Via Linq, können Sie tun:

from row in StringDates
group row by true into r 
select new { 
    min = r.Min(z => z), 
    max = r.Max(z => z) 
}

Dies ist ähnlich @ Jeffrey Antwort, sondern jeden Tag der Parsen, findet er zuerst die Min- und Max-Daten seine String-Werte zu vergleichen, und dann analysiert er die Werte am Ende.

// This method handles the date comparisons
private int WeirdComparer(string strDate1, string strDate2)
{
    int res = string.Compare(strDate1, 6, strDate2, 6, 4);
    if (res == 0)
        res = string.Compare(strDate1, 3, strDate2, 3, 2);
    if (res == 0)
        res = string.Compare(strDate1, 0, strDate2, 0, 2);
    return res;
}

public void FindMinAndMaxDates(IList<string> strDates, out DateTime minDate, out DateTime maxDate)
{
    string min = "99.99.9999";
    string max = "00.00.0000";
    foreach (string strDate in strDates)
    {
        if (WeirdComparer(strDate, min) < 0)
            min = strDate;
        if (WeirdComparer(strDate, max) > 0)
            max = strDate;
    }
    minDate = DateTime.ParseExact(min, "dd.MM.yyyy", null);
    maxDate = DateTime.ParseExact(max, "dd.MM.yyyy", null);
}

Ich weiß, das ist nicht eine direkte Antwort auf Ihre Frage, kann aber andere helfen, wenn sie hierher kommen die Suche nach etwas ähnlichem.

Ich lief heute über dieses Problem bei dem Versuch, nur den max Datum aus einer Liste von Objekten zu finden. Manchmal gibt es keinen Wert in dem Tag für die Objekte sein, so musste ich herausfinden, wie ein Versuch Parst verwenden, um mit meinem Linq.

Aus einer Kombination von dem, was Mark verwendet hier ich mit diesem kam zu meinem Problem

lösen
        List<string> stringDates = new List<string>();
        stringDates.Add("Not a date");
        stringDates.Add("2015-01-01");
        stringDates.Add("2015-10-10");
        stringDates.Add("2015-9-10");
        stringDates.Add("123");

        DateTime sapInvoiceDate;
        DateTime tempDate = DateTime.MinValue;
        sapInvoiceDate = stringDates.Select(x => DateTime.TryParse(x, out tempDate)).Select(x => tempDate).Max();  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top