Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获得下一个500“;“免费”;数字_C#_Asp.net_Arrays_Integer - Fatal编程技术网

C# 获得下一个500“;“免费”;数字

C# 获得下一个500“;“免费”;数字,c#,asp.net,arrays,integer,C#,Asp.net,Arrays,Integer,我有一个带有数字的数组,表示使用过的位置。我想从数字1到任意数字,得到前500个未使用的数字 例如,我的数组包含以下数字:1,2,5,6,8,9 基于该数组,我希望有一个包含以下数字的新数组:3,4,7,10,11,12,13,14…500501502507 有没有比使用一个递增的循环更有效的方法,检查该数字是否包含在默认数组中,如果不将其放入新数组中,检查新数组是否有500个值,然后从循环中断 谢谢 我建议实施生成器: 您可以使用linq: IEnumerable<int> res

我有一个带有数字的数组,表示使用过的位置。我想从数字1到任意数字,得到前500个未使用的数字

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

基于该数组,我希望有一个包含以下数字的新数组:3,4,7,10,11,12,13,14…500501502507

有没有比使用一个递增的循环更有效的方法,检查该数字是否包含在默认数组中,如果不将其放入新数组中,检查新数组是否有500个值,然后从循环中断

谢谢

我建议实施生成器:

您可以使用linq:

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

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

请浏览以下连结:


给定您的输入和500个数字的输出,最后一个数字是506,而不是507

拥有一个包含
Id
属性和
IsUsed
属性的
Location
对象不是更容易吗?这样,您就可以通过LINQ过滤掉任何使用过的
~is
提示:假设您正在编写C标准库——有人不得不这样做!您将如何有效地实施
malloc
?因为您的问题与malloc非常相似:您有一堆已经使用的内存,有人要求您再提供500个连续字节,您必须提供它们。您可以比使用一个数组更有效地执行此操作,该数组中的每个字节都有一个数字。第二个提示:Malloc不使用数组。由于选择了错误的数据结构,您的算法无法提高效率。选择一个数据结构而不是一个数组来表示您的忙/闲列表。@EricLippert:可能OP没有选择该数据结构,但这是一项要求。在这种情况下,您可以从中生成自己的最佳数据结构,然后再开始确定所需的500个数字。
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
IEnumerable<int> result = list.Except(usedList).Take(500);
public int[] GetMissingNumbers(int[] provided, int maxLength)
{
    var numbersBeyondEndOfProvidedRange = Enumerable.Range(1, provided.Length + maxLength);
    return numbersBeyondEndOfProvidedRange.Except(provided).Take(maxLength).ToArray();
}