Проверьте, есть ли в словаре<string, string> непрерывные элементы (DateTime)
У меня есть следующее Dictionary<string,string>
:
bool hasContinuousDays = false;
var selectedDates = new Dictionary<string, string>();
selectedDates.Add("2014-06-21", DateTime.Now.ToString());
selectedDates.Add("2014-06-22", DateTime.Now.AddDays(1).ToString());
selectedDates.Add("2014-06-23", DateTime.Now.AddDays(2).ToString());
selectedDates.Add("2014-06-24", DateTime.Now.AddDays(3).ToString());
Вышеуказанные элементы имеют непрерывные дни (6,7,8,9), поэтому hasContinuousDays = true
,
var selectedDates = new Dictionary<string, string>();
selectedDates.Add("2014-06-21", DateTime.Now.ToString());
selectedDates.Add("2014-06-24", DateTime.Now.AddDays(1).ToString());
selectedDates.Add("2014-06-25", DateTime.Now.AddDays(3).ToString());
selectedDates.Add("2014-06-26", DateTime.Now.AddDays(4).ToString());
Вышеуказанные элементы имеют непрерывные дни, поэтому hasContinuousDays = false
,
Как узнать, есть ли в словаре непрерывный
DateTime
или нет, я должен подтвердить это, используя значение (а не ключ).
Ценю любые советы.
3 ответа
Решение
bool hasContinuousDays = false;
var selectedDates = new Dictionary<string, string>();
selectedDates.Add("2014-06-21", DateTime.Now.ToString());
selectedDates.Add("2014-06-22", DateTime.Now.AddDays(1).ToString());
selectedDates.Add("2014-06-23", DateTime.Now.AddDays(2).ToString());
selectedDates.Add("2014-06-24", DateTime.Now.AddDays(3).ToString());
DateTime lastDay = DateTime.Parse(selectedDates.Values.First());
hasContinuousDays = selectedDates.Values.Skip(1).All(
str=> {
var day = DateTime.Parse(str);
var b = day == lastDay.AddDays(1);
lastDay = day;
return b;
});
hasContinuousDays .Dump();
Вот функциональный способ сделать это. Учитывая Dictionary<string,DateTime>
(что вы должны иметь), вы можете:
- получить коллекцию значений
- застегните коллекцию с хвостом, предоставив вам список всех последовательных пар дат
проверьте, что каждая пара находится на расстоянии ровно одного дня
var dates = selectedDates.Values; dates.OrderBy(d => d) .Zip(dates.Skip(1), Tuple.Create) .All(pair => (pair.Item2 - pair.Item1).Days == 1);
Что-то вроде:
static bool IsContinuous(IDictionary<string,string> dates) {
DateTime? lastDate = null;
foreach (var date in dates
.Values
.Select(d => DateTime.Parse(d))
.OrderBy(d => d)) {
if (lastDate.HasValue && (date - lastDate.Value).TotalDays != 1.0) {
return false;
}
lastDate = date;
}
return true;
}
Вопрос в том, почему вы сериализуете дату и время в строку (по крайней мере, укажите культуру); формат словаря пахнет как проблема ху.