假设我有以下代码:
在此示例中,第一个可用的数字为2
。
List<long> myList = new List<long>(){0,1,10,3};
在这个例子中,第一个可用的数字是'4'。
List<long> myList = new List<long>(){0,1,2,3};
任何想法?
答案 0 :(得分:5)
因此,“可用”是指“列表中尚不存在的最低非负数”?
我很想写一些类似的东西:
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...");
编辑:或者,您可以订购列表,然后找到索引与值不同的第一个值...
var ordered = list.OrderBy(x => x);
var differences = ordered.Select((value, index) => new { value, index })
.Where(pair => pair.value != pair.index)
.Select(pair => (int?) pair.index);
var firstDifference = differences.FirstOrDefault();
long nextAvailable = firstDifference ?? list.Count;
最后一行是处理列表从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();
只要列表不包含long.MaxValue + 1
元素,这应该没问题,但在当前版本的.NET中它不能。 (这是很多记忆......)说实话,由于int.MaxValue
部分采用Select
索引而超出int
元素,这已经存在问题...... < / p>
答案 1 :(得分:2)
list.Sort();
var range = Enumerable.Range( list.First(), list.Last()- list.First());
var number = range.Except(list).FirstOrDefault();