获取下一个500个“免费”号码

时间:2017-05-15 14:36:49

标签: c# asp.net arrays integer

我有一个数字数组,代表使用过的位置。我希望将前1个未使用的数字从1号到任意数字。

例如,我的数组包含以下数字:1,2,5,6,8,9

基于该数组,我希望有一个包含以下数字的新数组:3,4,7,10,11,12,13,14 .... 500,501,502,503,504,505,506,507

是否有更有效的方法比拥有一个数字越来越多的循环,检查默认数组是否包含该数字,如果没有将它放在新数组中,检查新数组是否有500个值然后中断从循环?

谢谢!

4 个答案:

答案 0 :(得分:2)

我建议实施 generator

// source should be sorted
private static IEnumerable<int> Free(IEnumerable<int> source) {
  int last = 0;
  bool first = true;

  foreach (var item in source) {
    if (first) 
      first = false;
    else 
      for (int i = last + 1; i < item; ++i) // <- Hole 
        yield return i;

    last = item;
  }

  // The array exhausted
  for (int i = last + 1; ; ++i)
    yield return i;
}

然后在 Linq

的帮助下生成任意数量的项目
int[] used = new[] { 1,2,5,6,8,9};

int[] free = Free(used)
  .Take(501) // <- if you want 507 being the last item you have to take 501 items
  .ToArray();

Console.Write(string.Join(", ", free));

结果:

3, 4, 7, 10, 11, 12, 13, 14, ..., 505, 506, 507

答案 1 :(得分:2)

您可以使用linq:

IEnumerable<int> result = list.Except(usedList).Take(500);

答案 2 :(得分:1)

public int[] GetMissingNumbers(int[] provided, int maxLength)
{
    var numbersBeyondEndOfProvidedRange = Enumerable.Range(1, provided.Length + maxLength);
    return numbersBeyondEndOfProvidedRange.Except(provided).Take(maxLength).ToArray();
}

鉴于您的输入和500个数字的输出,最后一个数字是506,而不是507.

答案 3 :(得分:0)

您可以使用IEnumerable集合的GetRange方法

请访问以下链接:https://msdn.microsoft.com/en-us/library/21k0e39c(v=vs.110).aspx