Compare DateTime Lists c # linq


1

Из вашего вопроса (и другие ответы не являются тем, что вы хотите), я делаю вывод, что вы хотите, чтобы все даты имели какие-либо совпадения с диапазоном, который вы ищете.

Трудно включить все случаи в простой логический оператор. Это намного проще, если вы его инвертируете. Другими словами, давайте посмотрим даты, которые не пересекаются, а затем получат другие.

Как бы мы определили диапазон, который не перекрывается. Ну, это может быть одна из двух вещей:

  • Это уже закончилось до начала периода поиска. (произошло слишком рано)
  • ИЛИ Он запускается только после окончания периода поиска. (произошло слишком поздно)

Это охватывает все случаи, предполагая, что стартовая дата никогда не может быть больше даты окончания (которую вы уже должны проверять!).
Итак, теперь мы инвертируем логику:

  • Это закончилось после того, как начался период поиска (= не было слишком рано)
  • И он начался до окончания периода поиска (= не произошло слишком поздно)

Если еще не слишком рано, и еще не слишком поздно, тогда это должно быть правильно .

myDate.Start

Дальнейшее объяснение

Я знаю, что это странно, чтобы соответствовать вашему Startdate с концом вашего периода и наоборот. Но это имеет смысл. Если мы рассмотрим допустимые даты начала, возможны два варианта:

  • Те, кто начал в период , который вы ищете ( endperiod< myDate.Start< startPeriod)
  • Те, кто начал до того периода , который вы ищете ( endperiod< myDate.Start< startPeriod)

Если вы посмотрите в круглые скобки, вы увидите неожиданную (но неоспоримую) правду: неважно, myDate.Startпроизошло ли это до или после endperiod; так как может быть правильным.
Однако, в обоих случаях, myDate.Startбудет всегда меньше , чем endperiod. Именно поэтому мы сопоставляем myDate.Startс endPeriod.

Если myDate.Endне меньше startperiod, то это случилось слишком поздно .

Такая же логика справедлива и для рассмотрения startToCheckи endToCheck. Если вы запишете это, вы увидите тот же шаблон.

Примечание. Я только уточнил одно из двух сравнений (поскольку они работают по одному и тому же принципу), но вы должны использовать оба варианта, если хотите получить правильный результат. Они не могут работать отдельно, поскольку обе они являются неполными оценками (но вместе они полны)


0

Для того, чтобы найти какие - либо элементы списка , которые перекрывают друг друга startToCheckв endToCheckпределах, достаточно найти какие - либо элементы , которые содержат или один.

List<Dates> listOfDateRanges;

var ans = listOfDateRanges.Where(r => (r.Start <= startToCheck && startToCheck < r.End) || (r.Start < endToCheck && endToCheck <= r.End) ||
(startToCheck <= r.Start && r.End <= endToCheck));

-1

Попробуйте использовать DateTime.Compareметод: https://msdn.microsoft.com/en-us/library/system.datetime.compare(v=vs.95).aspx

C #, LINQ, дата и время,

c#,linq,datetime,

0

Ответов: 3


1

Из вашего вопроса (и другие ответы не являются тем, что вы хотите), я делаю вывод, что вы хотите, чтобы все даты имели какие-либо совпадения с диапазоном, который вы ищете.

Трудно включить все случаи в простой логический оператор. Это намного проще, если вы его инвертируете. Другими словами, давайте посмотрим даты, которые не пересекаются, а затем получат другие.

Как бы мы определили диапазон, который не перекрывается. Ну, это может быть одна из двух вещей:

  • Это уже закончилось до начала периода поиска. (произошло слишком рано)
  • ИЛИ Он запускается только после окончания периода поиска. (произошло слишком поздно)

Это охватывает все случаи, предполагая, что стартовая дата никогда не может быть больше даты окончания (которую вы уже должны проверять!).
Итак, теперь мы инвертируем логику:

  • Это закончилось после того, как начался период поиска (= не было слишком рано)
  • И он начался до окончания периода поиска (= не произошло слишком поздно)

Если еще не слишком рано, и еще не слишком поздно, тогда это должно быть правильно .

myDate.Start

Дальнейшее объяснение

Я знаю, что это странно, чтобы соответствовать вашему Startdate с концом вашего периода и наоборот. Но это имеет смысл. Если мы рассмотрим допустимые даты начала, возможны два варианта:

  • Те, кто начал в период , который вы ищете ( endperiod< myDate.Start< startPeriod)
  • Те, кто начал до того периода , который вы ищете ( endperiod< myDate.Start< startPeriod)

Если вы посмотрите в круглые скобки, вы увидите неожиданную (но неоспоримую) правду: неважно, myDate.Startпроизошло ли это до или после endperiod; так как может быть правильным.
Однако, в обоих случаях, myDate.Startбудет всегда меньше , чем endperiod. Именно поэтому мы сопоставляем myDate.Startс endPeriod.

Если myDate.Endне меньше startperiod, то это случилось слишком поздно .

Такая же логика справедлива и для рассмотрения startToCheckи endToCheck. Если вы запишете это, вы увидите тот же шаблон.

Примечание. Я только уточнил одно из двух сравнений (поскольку они работают по одному и тому же принципу), но вы должны использовать оба варианта, если хотите получить правильный результат. Они не могут работать отдельно, поскольку обе они являются неполными оценками (но вместе они полны)


0

Для того, чтобы найти какие - либо элементы списка , которые перекрывают друг друга startToCheckв endToCheckпределах, достаточно найти какие - либо элементы , которые содержат или один.

List<Dates> listOfDateRanges;

var ans = listOfDateRanges.Where(r => (r.Start <= startToCheck && startToCheck < r.End) || (r.Start < endToCheck && endToCheck <= r.End) ||
(startToCheck <= r.Start && r.End <= endToCheck));

-1

Попробуйте использовать DateTime.Compareметод: https://msdn.microsoft.com/en-us/library/system.datetime.compare(v=vs.95).aspx

C #, LINQ, дата и время,
Похожие вопросы