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();