C# 在列表中查找第一个可用的长字符串<;长期>;

C# 在列表中查找第一个可用的长字符串<;长期>;,c#,list,long-integer,C#,List,Long Integer,好的,这应该很有趣 假设我有以下代码: 在本例中,第一个可用的数字是2 List myList=newlist(){0,1,10,3} 在本例中,第一个可用的数字是“4” List myList=newlist(){0,1,2,3} 有什么想法吗?那么“可用”是指“列表中不存在的最低非负数” 我很想写一些像这样的东西: HashSet<long> existing = new HashSet<long>(list); for (long x = 0; x < lon

好的,这应该很有趣

假设我有以下代码:

在本例中,第一个可用的数字是
2

List myList=newlist(){0,1,10,3}

在本例中,第一个可用的数字是“4”

List myList=newlist(){0,1,2,3}

有什么想法吗?

那么“可用”是指“列表中不存在的最低非负数”

我很想写一些像这样的东西:

HashSet<long> existing = new HashSet<long>(list);
for (long x = 0; x < long.MaxValue; x++)
{
    if (!existing.Contains(x))
    {
        return x;
    }
}
throw new InvalidOperationException("Somehow the list is enormous...");
最后一行是处理列表从0开始连续的情况。另一种选择是:

var nextAvailable = list.Concat(new[] { long.MaxValue })
                        .OrderBy(x => x)
                        .Select((value, index) => new { value, index })
                        .Where(pair => pair.value != pair.index)
                        .Select(pair => pair.index)
                        .First();
只要列表不包含当前版本的.NET中不能包含的
long.MaxValue+1
元素,就可以了。(这是一个很大的内存…)老实说,当它超出
int.MaxValue
元素时,就会出现问题,因为
Select
部分使用
int
索引…

所以“可用”是指“列表中不存在的最低非负数”

list.Sort();

var range = Enumerable.Range( list.First(), list.Last()- list.First());

var number = range.Except(list).FirstOrDefault();
我很想写一些像这样的东西:

HashSet<long> existing = new HashSet<long>(list);
for (long x = 0; x < long.MaxValue; x++)
{
    if (!existing.Contains(x))
    {
        return x;
    }
}
throw new InvalidOperationException("Somehow the list is enormous...");
最后一行是处理列表从0开始连续的情况。另一种选择是:

var nextAvailable = list.Concat(new[] { long.MaxValue })
                        .OrderBy(x => x)
                        .Select((value, index) => new { value, index })
                        .Where(pair => pair.value != pair.index)
                        .Select(pair => pair.index)
                        .First();

只要列表不包含当前版本的.NET中不能包含的
long.MaxValue+1
元素,就可以了。(这是一个很大的内存…)老实说,当它超出
int.MaxValue
元素时,就会出现问题,因为
Select
部分使用
int
索引…

数字总是从0开始吗?您是否要修改列表,并在以后要求提供第一个可用的号码?号码始终从零开始,并且列表肯定会在以后进行修改。号码是否始终从0开始?您是否要修改列表并在以后请求第一个可用的号码?这些号码将始终从零开始,列表肯定会在以后修改。您的第二个建议在最后一行有错误,
??
在这种情况下无法应用。@Dementic:已修复,谢谢-我在错误的表达式上使用了
FirstOrDefault
。最后我使用了你的第三种方法,因为我只是喜欢Lambda Linq。你的第二个建议在最后一行有错误,
不能应用于这种情况。@Dementic:Fixed,谢谢-我在错误的表达式上使用了
FirstOrDefault
。最后我使用了你的第三种方法,因为我只是喜欢Lambda Linq。
list.Sort();

var range = Enumerable.Range( list.First(), list.Last()- list.First());

var number = range.Except(list).FirstOrDefault();