C # - Рассчитать минимальную дату / максимальную дату из списка - PullRequest
8 голосов
/ 26 февраля 2010

У меня есть список, который содержит даты:

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 #, каков наилучший / кратчайший способ узнать минимальную / максимальную дату из этого списка?

Ответы [ 6 ]

24 голосов
/ 26 февраля 2010

Преобразуйте их в DateTime, используя ParseExact (или TryParseExact), а затем используйте Linq для получения Min и Max:

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

Обратите внимание, что в вашем примере список уже отсортирован в порядке возрастания. Если вы можете гарантировать, что так будет всегда, и вам нужна лучшая производительность, вы можете просто взять первый и последний элемент, который будет O (1) вместо O (n). Но вышесказанное безопаснее, поэтому, даже если ваш список, вероятно, всегда будет отсортирован, вам, вероятно, не стоит проводить эту оптимизацию, если она вам действительно не нужна, на тот случай, если однажды список не будет отсортирован.

18 голосов
/ 26 февраля 2010

Мне нравится простое решение.

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;
}
17 голосов
/ 26 февраля 2010

используйте 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));
2 голосов
/ 26 февраля 2010

Через Linq вы можете сделать:

from row in StringDates
group row by true into r 
select new { 
    min = r.Min(z => z), 
    max = r.Max(z => z) 
}
0 голосов
/ 27 августа 2015

Я знаю, что это не прямой ответ на ваш вопрос, но может помочь другим, если они придут сюда в поисках чего-то подобного.

Сегодня я столкнулся с этой проблемой, пытаясь найти только максимальную дату в списке объектов. Иногда в дате не будет значения для объектов, поэтому мне пришлось выяснить, как использовать попытку анализа с моим linq.

Из комбинации того, что использовал Марк здесь Я придумал это, чтобы решить мою проблему

        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();  
0 голосов
/ 26 февраля 2010

Это похоже на ответ @ Jeffrey, но вместо анализа каждой даты сначала находит минимальную и максимальную даты, сравнивая свои строковые значения, а затем анализирует значения в конце.

// 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...