在List <long> </long>中找到第一个可用的long

时间:2011-10-23 18:40:53

标签: c# list long-integer

好的,这应该很有趣。

假设我有以下代码:

在此示例中,第一个可用的数字为2

List<long> myList = new List<long>(){0,1,10,3};

在这个例子中,第一个可用的数字是'4'。

List<long> myList = new List<long>(){0,1,2,3};

任何想法?

2 个答案:

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