使用LINQ获取下一个可用的整数

Dan*_*ams 5 c# linq linq-to-objects

说我有一个整数列表:

List<int> myInts = new List<int>() {1,2,3,5,8,13,21};
Run Code Online (Sandbox Code Playgroud)

我想得到下一个可用的整数,按增加整数排序.不是最后一个或最高的,但在这种情况下,下一个不在此列表中的整数.在这种情况下,数字是4.

是否有一个LINQ语句会给我这个?如:

var nextAvailable = myInts.SomeCoolLinqMethod();
Run Code Online (Sandbox Code Playgroud)

编辑:废话.我说答案应该是2,但我的意思是4.我为此道歉!

例如:想象一下,您负责分发流程ID.您想获取当前进程ID的列表,并发出下一个进程ID,但下一个进程ID不应该只是最高值加1.相反,它应该是从有序的进程ID列表中可用的下一个.你可以从最高的开始获得下一个可用的,它并不重要.

Eli*_*ing 28

我看到很多编写自定义扩展方法的答案,但是可以使用标准的linq扩展方法和静态Enumerable类来解决这个问题:

List<int> myInts = new List<int>() {1,2,3,5,8,13,21};

// This will set firstAvailable to 4.
int firstAvailable = Enumerable.Range(1, Int32.MaxValue).Except(myInts).First();
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 0

public static class IntExtensions
{
    public static int? SomeCoolLinqMethod(this IEnumerable<int> ints)
    {
        int counter = ints.Count() > 0 ? ints.First() : -1;

        while (counter < int.MaxValue)
        {
            if (!ints.Contains(++counter)) return counter;
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var nextAvailable = myInts.SomeCoolLinqMethod();
Run Code Online (Sandbox Code Playgroud)

  • 但这不是我试图解决的问题。优化最好留到主要逻辑就位之后,并且仅在需要时才进行。 (2认同)