У меня есть Список, который содержит Даты:
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#, что лучший/самый короткий путь состоит в том, чтобы узнать минимальную дату / макс. дата из этого списка?
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;
}
Преобразуйте их в 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). Но приведенное выше является более безопасным, поэтому, даже если ваш список, вероятно, всегда будет отсортирован, вам, вероятно, не следует проводить эту оптимизацию, если она вам действительно не нужна, на случай, если однажды список не будет отсортирован.
Через Linq вы можете сделать:
from row in StringDates
group row by true into r
select new {
min = r.Min(z => z),
max = r.Max(z => z)
}
используйте 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));
Это похоже на ответ @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);
}