-4

我有以下内容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的,我应该使用值(而不是键)来验证它。

感谢任何建议。

4

3 回答 3

2

这是一种功能性的方法。给定一个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);
    
于 2014-07-28T14:52:16.783 回答
1
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();  
于 2014-07-28T14:43:19.897 回答
0

就像是:

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

问题是为什么要将日期时间序列化为字符串(至少指定文化);字典的格式闻起来像 xy 问题。

于 2014-07-28T14:33:17.793 回答