首页 新闻 会员 周边 捐助

c#编号自动生成,取中间没有使用的编号

0
悬赏园豆:20 [已解决问题] 解决于 2018-11-16 09:12
序号生成:从1到1000,其中已使用了部分序号,存在不连续的,如目前是1,2,3,7,12,13,22,31,53,121,221,671,998,现需要获取一个新的编号,只要没被使用即可,求最优算法?
三人成虎的主页 三人成虎 | 初学一级 | 园豆:150
提问于:2017-12-15 17:01
< >
分享
最佳答案
0
 public class No
        {
            public int Number { get; set; }
            public bool IsUsed { get; set; } = false;
        }

        public List<No> NoManage()
        {
            List<No> _list = new List<No>();
            for (int i = 1; i <= 1000; i++)
            {
                No no = new No();
                no.Number = i;
                _list.Add(no);
            }
            return _list;
        }

        public No GetNoUsed(List<No> _list)
        {
            return _list.Where(o => !o.IsUsed).SingleOrDefault();
        }
收获园豆:20
大楚打码人 | 老鸟四级 |园豆:4313 | 2017-12-16 12:53

这个方案不错

三人成虎 | 园豆:150 (初学一级) | 2017-12-16 15:04
其他回答(4)
0

1,2,3,7,12,13,22,31,53,121,221,671,998,现需要获取一个新的编号,只要没被使用即可,求最优算法?

释放的时候 存起来 到时候直接取出来用。

SoarNo1 | 园豆:195 (初学一级) | 2017-12-15 17:23

不是最好的方法

支持(0) 反对(0) 三人成虎 | 园豆:150 (初学一级) | 2017-12-15 17:24

@三人成虎: 论速度这个速度是 o(1) 没有任何遍历 等操作。

因为从一个 盘子 拿到另一个盘子 这种操作是最简单最直接的。

论体积这确实不是最好的。

你是要操作数据库的 自增ID么?

支持(1) 反对(0) SoarNo1 | 园豆:195 (初学一级) | 2017-12-15 23:13
0

我写过,但估计不是最优的,同求

~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2017-12-15 17:25
0

bitmap

构建长度1k的bool数组,对已有数据遍历同时对对应偏移量的bool数组元素设为true,以后拿取时只需遍历bool数组找到第一个为false的的偏移量加1就是你的编号

Daniel Cai | 园豆:10424 (专家六级) | 2017-12-15 17:47
0

看了上面的方法,还是有必改进的空间。

这个问题从本质上讲就是一个排序问题,向上面贫民窟大侠回的就用了两次排序解决问题的。而且还封装了对象,有点繁琐。

我的方法是:

1、定义1000大小的数组list[1000],全部赋值为0;

2、取值时:int index=list.IndexOf(0);

3、释放时:list[index]=0;

如上,不需要任何查询或复杂逻辑就可以实现这个功能了。

另外,我的这个方法中我留了一个Bug希望你能看出来哦。不谢!

中文代码 | 园豆:951 (小虾三级) | 2017-12-18 16:53

感谢关注,还没看到更优雅的处理方式。

支持(0) 反对(0) 三人成虎 | 园豆:150 (初学一级) | 2017-12-20 10:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册