Проверьте, есть ли в словаре<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> (что вы должны иметь), вы можете:

  1. получить коллекцию значений
  2. застегните коллекцию с хвостом, предоставив вам список всех последовательных пар дат
  3. проверьте, что каждая пара находится на расстоянии ровно одного дня

    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;
}

Вопрос в том, почему вы сериализуете дату и время в строку (по крайней мере, укажите культуру); формат словаря пахнет как проблема ху.

Другие вопросы по тегам