方法1:

private static List<int> DistinctList(List<int> list)
{//去除重复
HashSet<int> ha = new HashSet<int>(list);
list.Clear();
list.AddRange(ha);
return list;
}

原理:HashSet每次存入会计算哈希值,哈希值相同则比较对方是否相同,不同则直接存入

方法2:

private static List<int> DistinctList2(List<int> list)
{
return list.Distinct().ToList(); }

原理:Enumerable中Distinct官方实现

static IEnumerable<TSource> DistinctIterator<TSource>(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer) {
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}

拾忆

1.HashSet
只去重复, 没有顺序
HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法.

2.TreeSet
去重复, 并且可以按照某种顺序排序
TreeSet的add方法会将对象转为Comparable, 然后调用compareTo方法, 所以存储在TreeSet中的对象必须实现Comparable, 重写compareTo方法

HashSet原理:

/*
* 如果我们希望一个集合有去重复的功能, 可以在它的add方法中检查要添加的对象在集合中是否存在.
* 迭代集合中每个元素, 和要添加的比较, 如果相同, 就不存.
*
* 如果使用上述方法, 当集合元素特别多的时候, 效率会很低.
*例如: 集合中有1万个元素, 当存储下一个的时候, 需要和前面1万个都比较, 效率较低.
*
* HashSet的工作原理:
* 每次存储对象的时候, 调用对象的hashCode()方法, 计算一个哈希值. 在集合中查找是否包含哈希值相同的元素.
* 如果没有哈希值相同元素, 直接存入.
* 如果有哈希值相同的元素, 逐个使用equals()方法比较.
* 比较结果全为false就存入.
* 如果比较结果有true则不存.
*
* 如何将自定义类对象存入HashSet进行去重复
* 类中必须重写hashCode()方法和equals()方法
* equals()方法中比较所有属性
* hashCode()方法要保证属性相同的对象返回值相同, 属性不同的对象尽量不同

TreeSet原理:

/*
* TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法
*
* Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序)
*
* 如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口
* 在类上implement Comparable
* 重写compareTo()方法
* 在方法内定义比较算法, 根据大小关系, 返回正数负数或零
* 在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较, 根据比较结果使用二叉树形式进行存储
*/

最新文章

  1. ListView只更新某个item
  2. Python验证Url地址的正则表达式
  3. Spring总结—— IOC 和 Bean 的总结
  4. [UVA796]Critical Links(割边, 桥)
  5. 自己改写的asp.net MVC EF Respoistory 仓储模式
  6. python进阶6 HTTP协议客户端实现
  7. 在bmp上添加字符
  8. Spring MVC的异步模式
  9. Mycat安装与使用
  10. Django_验证码
  11. linux编译安装时常见错误解决办法
  12. Surging微服务的注意事项
  13. centos安装实用总结
  14. IE8 CSS hack
  15. Oracle重建表空间操作实例
  16. C++中的也能使用正则表达式----转载
  17. bzoj2458 最小三角形
  18. P2327 [SCOI2005]扫雷
  19. 2.springioc实例化bean的三个方法
  20. MySQL5.6版本性能调优my.cnf详解

热门文章

  1. Redhat7.5安装glusterfs4
  2. xdebug的配置
  3. jcgrid
  4. 运行vs2010,Debug时发生“无法启动程序&quot;http://localhost:xxx&quot;,系统找不到指定文件
  5. cb &amp;&amp; cb() 和 a || {}
  6. SSH的三种端口转发
  7. [转载]智能科普:VR、AR、MR的区别
  8. Redis缓存机制一为什么要用Redis
  9. 20171018 在小程序页面去获取用户的OpenID
  10. 有关java反射机制 小结