微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 确定整数列表中的第一个可用值

我有一个简单的ints列表.
List<int> myInts = new List<int>();

myInts.Add(0);
myInts.Add(1);
myInts.Add(4);
myInts.Add(6);
myInts.Add(24);

我的目标是从列表中获取一个未使用的(可用的)值.

(集合中尚未存在的第一个正值)

在这种情况下,答案是2.

这是我现在的代码

int GetFirstFreeInt()
{
    for (int i = 0; i < int.MaxValue; ++i)
    {
        if(!myInts.Contains(i))
            return i;
    }

    throw new InvalidOperationException("All integers are already used.");
}

有没有更好的办法?也许使用LINQ?你会如何做到这一点

当然这里我用简单的内容,但我的问题可以适用于任何类型.

解决方法

您基本上希望myInts中不包含序列0..int.MaxValue中的第一个元素:
int? firstAvailable = Enumerable.Range(0,int.MaxValue)
                                .Except(myInts)
                                .FirstOrDefault();

编辑响应评论

这里没有性能惩罚迭代到int.MaxValue. Linq将在内部创建一个hasInts的哈希表,然后开始迭代由Enumerable.Range()创建的序列 – 一旦没有包含在哈希表中的第一个项目被发现该除数()方法得到整数,由FirstOrDefault()返回 – 之后迭代停止.这意味着整体努力是用于创建散列表的O(n),然后是用于迭代序列的最坏情况O(n),其中n是myInt中的整数数.

关于Except()的更多信息,请参见Jon Skeet的EduLinq系列:Reimplementing LINQ to Objects: Part 17 – Except

原文地址:https://www.jb51.cc/csharp/95577.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐