(效率)(效率)如何判断泛型list中是否有相同的元素?怎么去除相同的元素只保留一个 本帖最后由 SCAUSCNU 于 2011-03-03 23:50:20 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.全部生成完了,再判断吧,有重复的就移除或者重新生成一个list.RemoveAll(l=>l.val > 0).Net3.5+ 可以利用HashSet<T> 类HashSet<T> 类提供高性能的集运算。 集合是一组不重复出现且无特定顺序的元素。 HashSet<T> 对象的容量是该对象可以容纳的元素个数。 HashSet<T> 对象的容量将随该对象中元素的添加而自动增大。 从 .NET Framework 4 版开始,HashSet<T> 类实现了 ISet<T> 接口。 但它不能通过索引访问,其Contains()方法的时间复杂度是List<T>的1/n,直接将List<T>拷至HashSet<T>中即消除了所有重复项。HashSet<T> hs = new HashSet<T>(list); list.Clear();list.AddRange(hs);2.应该说使用GUID重复的机率是很小很小的,至少一个项目里几乎是不会重复的如果还不放心,可以在前面加上当前的时间戳+GUID,不过这样貌似会显得很长 guid我加了哈希代码 Guid.NewGuid().GetHashCode() 对于一个限定用.net 2.0,c#3.0来说,linq根本不能用,不然就方便多了 没有哪个随机数生成器是以重复率低为设计目标的。虽然所有的随机数生成器产生的随机序列严格地说都是伪随机序列。好的随机数生成器,或者说随机数生成器的设计目标是生成的随机数更符合随机性,更贴近真实世界的随机数。它应该通过尽量多的随机性试验,具有很好的分布特性。所以随机数重复概率应该是p = 生成的随机数/随机组合总数(假设随机数生成器足够好)。之所以GUID不容易重复就是因为它的随机组合总数比较大。 虽然guid好,但是生成大量的数据,最后总要再加个判断里面有没有重复数据吧?然后问题就来了?如果我先生成全部数据再判断,我就不会了 如果说重复的概率足够低,低到什么程度呢?比你的程序出错概率低(比如你的程序可以无错工作100年,这个程序已经很了不起了),比人类的寿命长,……那么就可以认为概率为0。这样的重复足够可以忽略不计。GUID就是这样一种东西,虽然存在理论上重复的可能。但是没有任何一个人能活着看到这种情况发生。 严格地说,没有没有BUG的程序,没有可靠性=1的程序。自然界也没有绝对不会发生的事情。所以不要被理论上存在一个极小概率的事情迷惑。 你的意思是不用判断了??我们老师提示的是RNGCryptoServiceProvider,但是他里面还有写到,如果出现重复该怎么处理??好烦啊明天问一下同学,先谢谢楼上各位啦,我睡觉啦 如果用GUID,不用测试!如果老师问你,你这么说,GUID的重复概率甚至小于内存读取出错的概率。(比如你读取内存里面一个二进制1,有一个极小概率你得到的是0)。因此这种“检测”毫无意义。如同你不用考虑使用天平秤以前度量砝码上是否有灰尘。 再打一个比喻,在目前的硬件上检测GUID的重复,如同用厘米尺去测量一微米的长度一样。测量工具本身的精度比被测物体差。就算用一台最新的电脑不断生成GUID,你们老师直到去世也等不来重复发生。 不知道你怎么比较,和性能要求到多少,没生成一个用list.Contains判断一下应该不会很久吧。如果你想绝对不重复是一定要比较的。 用GUID就OK了。不会重复!如果不用,可以考虑Dictionary,键存储字符串而值给个NULL就行用方法ContainsKey判断速度很快! guid的所谓重复概率是理论上的,比你买彩票每天都中一千万概率都要小很多...你担心个什么? 反正我目前的项目中单独使用GUID做主键,唯一性有数据库约束着,假如插入失败,提示下用户系统错误,重新提交一下就好(其实这种假如根本不可能发生)如果是2.0,那也只好自己写个方法,遍历去判断了,不过使用GUID的话,我是觉得没有这个必要了,区区100000而已,别人上千万的都没有重复的 sb.Append(a[new Random(Guid.NewGuid().GetHashCode()).Next(0, a.Length -1)]); http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864 没看出来你用guid的目的,直接用字符串存储对比就可以了。因为string[] a;Array.Contains(a,"字符串")这样不慢的。 产生不重复的随机数,如23楼所示,我使用stringbuffer contains里面虽说只有一条语句,但实际是很复杂的算法实现?http://blog.csdn.net/zhoufoxcn/archive/2010/08/19/5825093.aspx 把照片贴上来"http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864http:// http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864 你为啥要生成这么多,10W个还要去判断,这样给程序增加负担,不妨考虑用时间戳,不会重复的,不用去判断,ps:你给他留言了吗?我没看到啊 其实我真的是 慕名来围观的------------------------------------直接guid就可以了, 就如P哥说的 你 "哈希"个什么???guid 生成后你无须去判断 是否重复。如果你真的害怕,你可以在 字符串的前 拼接个 时间日期比如: “20110304”+guid 想要真正的高效还是要想办法除去 判断重复 这一步...因为你是要16位的,所以要自己写一个生成随机字符串的方法...当然可以利用 Guid ... 本来有可能“BA”,到排序的时候变成了"AB",这样不是被误判断了,多生成了一次吗?况且,你添加的数字和随机生成的数字不会重复混淆吗?所有我的这种方法不太可行?如果不判断是否包含AB字符串,我的方法应该是可以的 楼主,如果你不是在开发核武器,GUID绝对足够满足你的需求。我很奇怪你为什么不相信官方的framework中现成的东西,非要自己从头做起;或者至少你把GUID研究透彻之后,再下结论也不迟。 我常用的方法是用Dictionary<string, string>, 键值都是生成的那个字符串。Java里我就用Hashtable。生成后用内建的containskey函数判断下就可以了。用这还挺顺手。拙见,见笑了。 为什么不看看这个帖子,早有前人讨论过这个问题了http://topic.csdn.net/t/20061024/14/5105293.html IEnumerable<string> inters = List1.Intersect(List2);交集 根据http://topic.csdn.net/t/20061024/14/5105293.html里面的,大家说说,如果:把生成的指定防伪码至少10万以上(因为一开始就是用list.contains判断了,生成的所以不重复)存入专门放置防伪码的数据库表里,规定放进去的防伪码不与表中已有的重复,想想:若是设置了防伪码为主键就无需判断啦,若出现重复虽插入失败,但是可是继续生成重新插入,这样比关于重复问题的比较效率应该快些吧,再说,通常插进去极少机会会遇到主键重复的,是批量插指定数量数据的,一定要达到自己设定的防伪码个数。大家觉得怎样呢? 请问一个关于C# RTP的问题??(解决给分) 关于lable的字体的设置 VS.NET2003下怎么做 wap 一个关于对XML文件查找替换的难题! 关于一段字符串的截取,有点难度,希望高手路过指点一下,谢谢! 谁有Sony VGN-S46C的安装盘? 在存储过程中用事务报错,求高手指点 把路径存在数据库,重新读取却变了。 简单问题,想用年份表示一个字符串怎么做?? 怎样在右击的同时也选定? 求教关于多人同时访问同一对象实例问题 c#组件和控件的区别,什么时候用组件?什么时候该用控件呢
list.RemoveAll(l=>l.val > 0)
.Net3.5+ 可以利用HashSet<T> 类HashSet<T> 类提供高性能的集运算。 集合是一组不重复出现且无特定顺序的元素。
HashSet<T> 对象的容量是该对象可以容纳的元素个数。 HashSet<T> 对象的容量将随该对象中元素的添加而自动增大。
从 .NET Framework 4 版开始,HashSet<T> 类实现了 ISet<T> 接口。
但它不能通过索引访问,其Contains()方法的时间复杂度是List<T>的1/n,直接将List<T>拷至HashSet<T>中即消除了所有重复项。
HashSet<T> hs = new HashSet<T>(list);
list.Clear();
list.AddRange(hs);2.应该说使用GUID重复的机率是很小很小的,至少一个项目里几乎是不会重复的
如果还不放心,可以在前面加上当前的时间戳+GUID,不过这样貌似会显得很长
明天问一下同学,先谢谢楼上各位啦,我睡觉啦
如果你想绝对不重复是一定要比较的。
如果不用,可以考虑Dictionary,键存储字符串而值给个NULL就行
用方法ContainsKey判断速度很快!
如果是2.0,那也只好自己写个方法,遍历去判断了,不过使用GUID的话,我是觉得没有这个必要了,区区100000而已,别人上千万的都没有重复的
string[] a;
Array.Contains(a,"字符串")
这样不慢的。
http://blog.csdn.net/zhoufoxcn/archive/2010/08/19/5825093.aspx
http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864http://
ps:你给他留言了吗?我没看到啊
因为你是要16位的,所以要自己写一个生成随机字符串的方法...
当然可以利用 Guid ...
况且,你添加的数字和随机生成的数字不会重复混淆吗?
所有我的这种方法不太可行?如果不判断是否包含AB字符串,我的方法应该是可以的
生成后用内建的containskey函数判断下就可以了。
用这还挺顺手。
拙见,见笑了。
http://topic.csdn.net/t/20061024/14/5105293.html
交集