Получение списка часов, которые не находятся в интервале - PullRequest
3 голосов
/ 19 мая 2019

Я пытаюсь получить список часов, которые не находятся в целочисленном интервале. Например, если интервал от 10 до 23, он должен вернуть [1,2,3,4,5,6,7,8,9,24].

Я написал этот метод.

List<int> GetTimeList(List<Mail> Mails, int TransferSpeed)
        {
            List<int> Hours = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };

            foreach (Mail mail in Mails)
            {
                Hours.RemoveAll(x => x >= mail.DateAndTime.Hour && x <= GetRoundedTransferTime(TransferSpeed, mail.Size));
            }
            return Hours;
        }

И это на самом деле прекрасно работает, но я ищу более элегантный и более эффективный способ.

Буду очень признателен, если вы поможете мне с этим.

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Вы можете использовать Linq's Except.

Например:

List<int> intervals=new List<int>
{
      10,11,12,13,14,15,16,17,18,19,20,21,22,23
 };

List<int> Hours = Enumerable.Range(1,24).ToList();

 var NotInIntervals=Hours.Except(intervals).ToList();

 foreach(var hour in NotInIntervals.OrderBy(x=>x))
  {
       Console.WriteLine(hour);
   }

Результат

1,2,3,4,5,6,7,8,9,24
0 голосов
/ 19 мая 2019

Моя первая попытка, вероятно, будет выглядеть примерно так.

(Хотя это работает достаточно хорошо для часов, оно не масштабируется до произвольного временного разрешения. Это также не оченьподходит для просмотра произвольных дней.)

var hours = Enumerable.Range(1, 24);

// Build sequence of ranges of all start..end hours.
// I put in an extra Select to-anon for code clarity-of-intent.
// SelectMany takes returns of [10,11,12],[1,2],[11,12] eg.
// and turns them into a single sequence like [10,11,12,1,2,11,12]
var exclusions = Mails
    .Select(m => new {
       Start = m.DateAndTime.Hour,
       // Don't care if we run past > 24, although THIS MIGHT BE
       // A DEFECT IN THE ORIGINAL that should be addressed..
       Duration = GetRoundedTransferTime(TransferSpeed, m.Size),
    })
    // To address previous potential defect, build appropriate
    // sequence in here that understands how to 'wrap around' days.
    .SelectMany(s => Enumerable.Range(s.Start, s.Duration));

// All hours in day minus exclusion hours.
// (Exclusion ranges are already expressed as individual hours.)
return hours.Except(exclusions)
    .OrderBy(h => h) // technically not needed here
    .ToList();

Кроме того, в качестве общего замечания: предпочитайте IReadOnlyList<T> или IEnumerable<T> (например,) типам возврата из методов, чтобы предотвратить «неожиданные мутации в вызывающих программах».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...