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# 确定整数列表中的第一个可用值_C#_Linq_Collections - Fatal编程技术网

C# 确定整数列表中的第一个可用值

C# 确定整数列表中的第一个可用值,c#,linq,collections,C#,Linq,Collections,我有一个简单的整数列表 List<int> myInts = new List<int>(); myInts.Add(0); myInts.Add(1); myInts.Add(4); myInts.Add(6); myInts.Add(24); List myInts=new List(); myInts.Add(0); 增加(1); 增加(4); 增加(6); 增加(24); 我的目标是从列表中获取第一个未使用(可用)的值 (集合中尚未出现的第一个正值) 在这种

我有一个简单的整数列表

List<int> myInts = new List<int>();

myInts.Add(0);
myInts.Add(1);
myInts.Add(4);
myInts.Add(6);
myInts.Add(24);
List myInts=new List();
myInts.Add(0);
增加(1);
增加(4);
增加(6);
增加(24);
我的目标是从列表中获取第一个未使用(可用)的值

(集合中尚未出现的第一个正值)

在这种情况下,答案是2

以下是我当前的代码:

int GetFirstFreeInt()
{
    for (int i = 0; i < int.MaxValue; ++i)
    {
        if(!myInts.Contains(i))
            return i;
    }

    throw new InvalidOperationException("All integers are already used.");
}
int GetFirstFreeInt()
{
对于(int i=0;i
有更好的办法吗?也许用LINQ?你会怎么做


当然,为了简单起见,我在这里使用了int,但我的问题可以应用于任何类型。

您基本上需要序列
0..int.MaxValue
中的第一个元素,它不包含在
myInts
中:

int? firstAvailable = Enumerable.Range(0, int.MaxValue)
                                .Except(myInts)
                                .FirstOrDefault();
编辑以回应评论:

迭代到
int.MaxValue
,这里没有性能损失。Linq将在内部为
myInts
创建一个哈希表,然后开始迭代由
Enumerable.Range()
创建的序列-一旦找到哈希表中不包含的第一个项,则由
Except()
方法生成整数,并由
FirstOrDefault()返回
-之后迭代停止。这意味着创建哈希表的总体工作量是O(n),然后最坏情况是迭代序列,其中n是
myInts
中的整数数


有关
Except()
的更多信息,请参见Jon Skeet的Edulink系列:

如果列表从最小到最大排序,并且包含从0到正无穷大的值,您可以简单地访问第i个元素<代码>如果(myInts[i]!=i)返回i
本质上是相同的,但不需要对每个
包含的
检查重复列表(Contains方法迭代列表,将算法转换为O(n平方)而不是O(n))。

列表是按升序排序的吗?@OsmanTuran Nope。该列表不保证以任何方式排序。很抱歉我忘了提到这个。很好,但是如果myInts包含{0,1,2,3}怎么办?在这种情况下,我需要返回4的方法。@asmo:Ah这个问题不清楚-在这种情况下,使用int.MaxValue作为上限,而不是
myInts.Max()
-我将更新答案。@asmo使其
myInts.Max()+1
@Lester:那么如果myInts.Max()就有了边缘条件已经是int了。MaxValue@Lester:请参阅更新的答案-没有性能损失,因为外部序列是延迟枚举的,并且只有在找到第一个未使用的整数之前才有性能损失。+1。是的,如果列表未排序,则在进行GGUGIA测试之前对其进行排序会更快。排序是O(n*log(n)),对于迭代包含检查,它比O(n^2)快。(如果我是对的,微软正在使用快速排序。)排序不会比使用哈希集更快,对于OPs问题,哈希集是O(n)