(效率)(效率)如何判断泛型list中是否有相同的元素?怎么去除相同的元素只保留一个

昵称是可以中文吗 2011-03-03 10:55:42
1.我用list存了随机生成的100000个(以上)的16位字符串(包括数字和字母),量很大,我每生成一个就跟前面的判断,条件不符就重新生成,结果效率低;我想能不能全部生成后再一起判断?
2.用guid听说生成重复的概率很小,所以我才选择全部生成后才一起判断的,这样ok吗?
有没有人试过用RNGCryptoServiceProvider 类使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器 (RNG)。
哪个重复可能性大,效率高??
...全文
1707 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰云 2011-06-08
  • 打赏
  • 举报
回复
我是顶那位追求者而来的....
去看看

话说你这种做法本身就是自找麻烦......
这种情况下是不适合用随机数的,
完全可以自己定一个算法来生成你所需要的字符串数列.
_chenlianjia 2011-05-07
  • 打赏
  • 举报
回复
根据http://topic.csdn.net/t/20061024/14/5105293.html里面的,大家说说,如果:把生成的指定防伪码至少10万以上(因为一开始就是用list.contains判断了,生成的所以不重复)存入专门放置防伪码的数据库表里,规定放进去的防伪码不与表中已有的重复,想想:若是设置了防伪码为主键就无需判断啦,若出现重复虽插入失败,但是可是继续生成重新插入,这样比关于重复问题的比较效率应该快些吧,再说,通常插进去极少机会会遇到主键重复的,是批量插指定数量数据的,一定要达到自己设定的防伪码个数。大家觉得怎样呢?
liyoubaidu 2011-03-19
  • 打赏
  • 举报
回复
龍月 2011-03-07
  • 打赏
  • 举报
回复
IEnumerable<string> inters = List1.Intersect(List2);
交集
sgchen 2011-03-07
  • 打赏
  • 举报
回复
为什么不看看这个帖子,早有前人讨论过这个问题了
http://topic.csdn.net/t/20061024/14/5105293.html
地下室小红叔 2011-03-05
  • 打赏
  • 举报
回复
楼主怎么没有回我呀 你看我在那个帖里还贴了大图呢 你去看看


技术问题么回头再讨论 其实楼主不如换个角度想 比如顺序递增生成 在固定位置(注册表或文件)中保留最近的生成值做为下一次的基准 如此尔尔 只要是单线程调用就不会有重复
threenewbee 2011-03-04
  • 打赏
  • 举报
回复
没有哪个随机数生成器是以重复率低为设计目标的。虽然所有的随机数生成器产生的随机序列严格地说都是伪随机序列。

好的随机数生成器,或者说随机数生成器的设计目标是生成的随机数更符合随机性,更贴近真实世界的随机数。它应该通过尽量多的随机性试验,具有很好的分布特性。

所以随机数重复概率应该是p = 生成的随机数/随机组合总数(假设随机数生成器足够好)。

之所以GUID不容易重复就是因为它的随机组合总数比较大。
  • 打赏
  • 举报
回复
对于一个限定用.net 2.0,c#3.0来说,linq根本不能用,不然就方便多了
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dongxinxi 的回复:]
1.全部生成完了,再判断吧,有重复的就移除或者重新生成一个
list.RemoveAll(l=>l.val > 0)
.Net3.5+ 可以利用HashSet<T> 类HashSet<T> 类提供高性能的集运算。 集合是一组不重复出现且无特定顺序的元素。
HashSet<T> 对象的容量是该对象可以容纳的元素个数。 HashSet<T> 对象的容量将随该对象中元素的添加而自动增大。
从……
[/Quote]
guid我加了哈希代码 Guid.NewGuid().GetHashCode()
  • 打赏
  • 举报
回复
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,不过这样貌似会显得很长
sugarforever 2011-03-04
  • 打赏
  • 举报
回复
我常用的方法是用Dictionary<string, string>, 键值都是生成的那个字符串。Java里我就用Hashtable。
生成后用内建的containskey函数判断下就可以了。
用这还挺顺手。
拙见,见笑了。
querystringcom 2011-03-04
  • 打赏
  • 举报
回复
用ARRAYLIST筛选掉重复的
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sp1234 的回复:]
引用 3 楼 scauscnu 的回复:
guid我加了哈希代码 Guid.NewGuid().GetHashCode()


“哈希”个什么?
[/Quote]

原来P哥有时候也弄到这么晚,搞程序不容易啊
  • 打赏
  • 举报
回复
反正我目前的项目中单独使用GUID做主键,唯一性有数据库约束着,假如插入失败,提示下用户系统错误,重新提交一下就好(其实这种假如根本不可能发生)
如果是2.0,那也只好自己写个方法,遍历去判断了,不过使用GUID的话,我是觉得没有这个必要了,区区100000而已,别人上千万的都没有重复的
vrhero 2011-03-04
  • 打赏
  • 举报
回复
guid的所谓重复概率是理论上的,比你买彩票每天都中一千万概率都要小很多...你担心个什么?
zzmsyt 2011-03-04
  • 打赏
  • 举报
回复
Contains还可以啊
没有访问权限 2011-03-04
  • 打赏
  • 举报
回复
用GUID就OK了。不会重复!
如果不用,可以考虑Dictionary,键存储字符串而值给个NULL就行
用方法ContainsKey判断速度很快!
sgchen 2011-03-04
  • 打赏
  • 举报
回复
不知道你怎么比较,和性能要求到多少,没生成一个用list.Contains判断一下应该不会很久吧。
如果你想绝对不重复是一定要比较的。
yhnujm##33 2011-03-04
  • 打赏
  • 举报
回复
全局统一标识符,真是不可思意!!
yalan 2011-03-04
  • 打赏
  • 举报
回复
我也想追~~~~~~~
加载更多回复(28)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧