集合去重

用实现IEqualityComparer<T>接口的类,来进行重复元素的消除。

  class Program
    {
        static void Main(string[] args)
        {
           //集合去重
            //List<int> list = new List<int>() { 1,2,3,4,4,4,5,5,6};
            //list.Distinct().ToList().ForEach(s => Console.WriteLine(s)) ;
            Person p1 = new Person() { Name="兰陵王",Age=19};
            Person p2 = new Person() { Name="兰陵王",Age=19};
            Person p3 = new Person() { Name="亚瑟",Age=20};
            Person p4 = new Person() { Name="兰陵王",Age=29};
            Person p5 = new Person() { Name="王昭君",Age=21};
            Person p6 = new Person() { Name="王昭君",Age=21};

            Person p7 = new Person() { Name = "兰陵王", Age = 29 };
            Person p8 = new Person() { Name = "王昭君", Age = 22 };

            List<Person> list = new List<Person>() { p1,p2,p3,p4,p5,p6,p7,p8};
            //list.Distinct(new Compare()).ToList().ForEach(s => Console.WriteLine(s.ToString()));
            list.Distinct(new Compare<Person>()).ToList().ForEach(s => Console.WriteLine(s.ToString()));

            Console.ReadKey();
        }

    }
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public override string ToString()
        {
            return string.Format("{0}\t{1}", this.Name, this.Age);
        }

    }

    public class Compare : IEqualityComparer<Person>
    {

        public bool Equals(Person x, Person y)
        {
            bool b= (x.Name == y.Name)&&(x.Age==y.Age);
            return b;
        }
        public int GetHashCode(Person obj)
        {
            return obj.Name.GetHashCode();
        }
    }
    public class Compare<T> : IEqualityComparer<T>
    {
        public bool Equals(T x, T y)
        {
           PropertyInfo[]properties= x.GetType().GetProperties();
            bool mark = true;
            foreach (var property in properties)
            {
                mark = mark && property.GetValue(x).Equals(property.GetValue(y));   //不能用==
            }
            return mark;
        }
        public int GetHashCode(T obj)
        {
            PropertyInfo[] properties = obj.GetType().GetProperties();
            //return    properties[0].GetValue(obj).ToString().GetHashCode();
            //return (properties[0].GetValue(obj).ToString()+properties[1].GetValue(obj)).GetHashCode();
            //return obj.GetHashCode();
            int a = (properties[0].GetValue(obj).ToString() + properties[1].GetValue(obj)).GetHashCode();
            int b= obj.GetHashCode();//只要不是同一个对象,产生的HashCode就不一样(即使它所有属性都相同)。
            return a;
        }
    }
    

IEqualityComparer<T>接口的两个方法,一个Equals,一个GetHashCode,先用GetHashCode做第一遍过滤,如果HashCode就不一样,就不会剔除,也不会进行Equals方法。如有一样,再用Equals方法进行比较。

其实如果把对象的所有属性作为HashCode,Equals直接返回true就可以了 。

时间: 2024-10-22 12:24:50

集合去重的相关文章

List集合去重的一种方法 z

需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不是我想要的,便采用了一下方式 定义Compare类,继承IEqualityComparer接口 public class ComparerHelper : IEqualityComparer<Model> { public bool Equals(Model x, Model y) { retur

List集合去重

对List集合去重: foreach (var item1 in projectName)//对项目名称去重 { if (projectName1.Exists(m => m.ProjectName == item1.ProjectName) == false) { projectName1.Add(item1); } }

set集合去重机制

set集合去重机制:先调用hash,若发现hash出的内存地址已被占用,会再次调用eq比较内容是否相同. __hash__对与同一个值的同一次运算的结果是相同的 class Employee: def __init__(self,name,age,sex,partment): self.name = name self.age = age self.sex = sex self.partment = partment def __hash__(self): return hash('%s%s'%

一个关于Linq对引用类型元素集合去重问题的思考

背景 说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接list.Distinct()即可.但是如果想要对一个引用类型的集合去重(属性值都相同就认为重复),就会发现,直接Distinct()是不行的: public class User { public int Id { get; set; } public string Name { get; set; } } var list = new List<User>() { ne

List集合去重方式及效率对比

List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一下List集合去重的常见及常用的四种方式. 01 实现思路:使用两个for循环遍历集合所有元素,然后进行判断是否有相同元素,如果有,则去除.这种方式是大部分最先想到的,也是最简单的实现方式.其中,这种方式可以保证List集合原来的顺序不变. 代码实现: /*** notes:使用两个for循环实现L

List集合去重各种方式汇总

package com.sb.test; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFacto

Java中list&lt;Object&gt;集合去重实例

一:Java中list去重的方法很多,下面说一下其中一种方法:把list里的对象遍历一遍,用list.contain(),如果不存在就放入到另外一个list集合中: 二:实例 这里需要注意的是:使用contains方法的时候,list中里面的对象是否相等的问题,我们知道对象是否相等,有两层意思,对象的地址相等和对象的属性值相等.而contains比对的时候调用的是object类中的equals方法: 我们可以看到,比对的是对象的地址.而实际中可能我们想要的结果是,对象里面的值想等,我们就认为这两

freemarker list集合去重,实现hashset

在freemarker中没有提供去重的方法,虽然有提供定义hash的方法,如:<#assign myHash = { "name": "mouse", "price": 50 }>,但是不能够动态构建hash. 通常我们会在java代码中进行处理,比如使用set集合.map对象处理. 但是如果一定要在freemarker文件中实现还是可以做到的,如下代码所示: introspectedTable.allColumns为java传递过来

Java集合去重

//普通集合List去重方法 public List<floorMapper> removethesame(List<floorMapper> list) { //创建一个临时集合装去重后的数据 List<floorMapper> tempList = new ArrayList<floorMapper>(); for (floorMapper i : list) { if (!tempList.contains(i)) {//判断是否有重复数据,如果没有就