C# - Вычислите минимальную дату / макс. дата из Списка

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

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

8
задан Kiquenet 26 April 2016 в 18:16
поделиться

5 ответов

Try Chronic (gem install chronical):

require 'rubygems'
require 'chronic'
puts Chronic.parse "03/17/81"
#=> Tue Mar 17 12:00:00 -0800 1981

Возвращает объект Time.

-121--3260446-

Одним из способов отладки является отладка функции.

Поместите курсор в подпрограмму slime-smart-quit и введите M-x edebug-defun . Тогда выйдите из Emacs, как обычно. Вам будет предложено отладчиком lisp Emacs edebug . Это довольно простой в использовании отладчик (для получения справки введите ? ).

Пройдите по коду и посмотрите, где он не делает того, что вы ожидаете.

Используйте q для выхода из отладчика, а затем внесите изменения и снова M-x edebug-defun для отладки новой версии.

Повторяйте до тех пор, пока не найдете успех или не получите немного больше информации для вопроса.

-121--2496165-

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

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;
}
18
ответ дан 5 December 2019 в 04:29
поделиться

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

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). Но приведенное выше является более безопасным, поэтому, даже если ваш список, вероятно, всегда будет отсортирован, вам, вероятно, не следует проводить эту оптимизацию, если она вам действительно не нужна, на случай, если однажды список не будет отсортирован.

25
ответ дан 5 December 2019 в 04:29
поделиться

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

from row in StringDates
group row by true into r 
select new { 
    min = r.Min(z => z), 
    max = r.Max(z => z) 
}
2
ответ дан 5 December 2019 в 04:29
поделиться

используйте 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));
19
ответ дан 5 December 2019 в 04:29
поделиться

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

// 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);
}
0
ответ дан 5 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: