获取不在时间间隔内的小时列表

3

我正在尝试获取不在整数区间内的小时列表。例如,如果区间是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
你可以使用Linq的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

而且 Enumerable.Range(1, 24)。从技术上讲,IEnuermable.Except 可能不会返回相同的顺序(对于 Linq2Objects,作为实现细节它会)。 - user2864740
另外,可以跳过中间的构建时间以排除它们。 - user2864740

0

我的第一次尝试可能看起来像这样。

(虽然这对于几个小时的工作足够好,但它无法扩展到任意时间分辨率。它也不太适合查看任意天数。)

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>(例如),以避免发生“调用者意料之外的变化”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接