zoukankan      html  css  js  c++  java
  • List 去除重复项 比较器

      static void Main(string[] args)
            {
                List<Person> personList =new List<Person>(){
                    new Person(3),//重复数据
                    new Person(3),
                    new Person(2),
                    new Person(1)
                };
    
                //使用匿名方法
                List<Person> delegateList = personList.Distinct(new Compare<Person>(
                    delegate(Person x, Person y)
                    {
                        if (null== x ||null== y) return false;
                        return x.ID == y.ID;
                    })).ToList();
    
                delegateList.ForEach(s => Console.WriteLine(s.ID));
    
                //使用 Lambda 表达式
                List<Person> lambdaList = personList.Distinct(new Compare<Person>(
                    (x, y) => (null!= x &&null!= y) && (x.ID == y.ID))).ToList();
    
                lambdaList.ForEach(s => Console.WriteLine(s.ID));
    
                //排序
                personList.Sort((x, y) => x.ID.CompareTo(y.ID));
                personList.ForEach(s => Console.WriteLine(s.ID));
    
            }
        }
        public class Person
        {
            public int ID { get; set; }
            public string Name { get; set; }
           
            public Person(int id)
            {
                this.ID = id;
            }
        }
    
        public delegate bool EqualsComparer<T>(T x, T y);
    
        public class Compare<T> : IEqualityComparer<T>
        {
            private EqualsComparer<T> _equalsComparer;
    
            public Compare(EqualsComparer<T> equalsComparer)
            {
                this._equalsComparer = equalsComparer;
            }
    
            public bool Equals(T x, T y)
            {
                if (null!=this._equalsComparer)
                    return this._equalsComparer(x, y);
                else
                    return false;
            }
    
            public int GetHashCode(T obj)
            {
                return obj.ToString().GetHashCode();
            }
        }
    

     //定义接口来实现 比较器的功能

    IComparer<T>接口定义了为比较两个对象而实现的方法。其定义如下:
     
    public interface IComparer<T>
    {
    inr Compare(T x,T y);
    }
    类型参数“T”是要比较的对象的类型。Compare方法比较两个对象并返回一个值,指示一个对象是小于,等于还是大于另一个对象。参数x是要比较的第一个对象,y是要比较的第二个对象,均属于类型T。
    如果返回值大于0,则x>y。
    如果返回值大于0,则x<y。
    如果返回值大于0,则x=y。
    
    IComparer<T>泛型接口主要的作用是,作为参数传入Sort()方法,实现对象比较方式的排序。Sort方法的语法语法如下:
    public void Sort (IComparer<T> comparer)
    这个方法的参数是IComparer<T>泛型接口,也称为比较器,如果将不同的比较器传入Sort()方法,就可以实现不同的比较方式。
    首先实现一个比较器,由于接口不能有方法的实现体,所以要具体实现方法,必须在派生类中完成。代码如下:
    public class NameCom:IComparer<Student>
    {
    //实现IComparer<T>中的方法
    public int Compare(Student x,Student y)
    {
    return (x.Name.CompareTo(y.Name));
    }
    }
    在派生类NameCom中实现了Compare方法,返回值即为两个对象比较后的值。定义了比较器之后,就要调用Sort方法实现顺序。
    示例代码如下:
    private void NameSort()
    {
    //传入实现了姓名升序比较器的对象
    lst.Sort(new NameCom())
    }
    其中,lst是List<Student>的一个集合对象,用来存储Student类的对象,Sort方法是List<>提供的排序方法,用new关键字创建了一个比较器的对象,作为参数传到Sort方法中,就实现了自定义方法排序的功能。下面通过一个简单的例子进一步了解IComparer<T>泛型接口的用法和使用价值。
    using System;
    using System.Collections.Generic;
    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
    private string name;
    // 姓名
    public string Name
    {
       get
       {
        return name;
       }
       set
       {
        name = value;
       }
    }
    private int age;
    // 年龄
    public int Age
    {
       get
       {
        return age;
       }
       set
       {
        age = value;
       }
    }
    private string grade;
    // 年级
    public string Grade
    {
       get
       {
        return grade;
       }
       set
       {
        grade = value;
       }
    }
    //构造函数
    public Student(string name, int age, string grade)
    {
       this.name = name;
       this.age = age;
       this.grade = grade;
    }
    public override string ToString()
    {
       return this.name + "," + this.age.ToString() + "," + this.grade;
    }
    }
    //接着定义一个用于比较的类,实现IComparer<T>泛型接口:
    public class StudentComparer: IComparer < Student >
    {
    public enum CompareType
    {
       Name, Age, Grade
    }
    private CompareType type;
    // 构造函数,根据type的值,判断按哪个字段排序
    public StudentComparer(CompareType type)
    {
       this.type = type;
    }
    public int Compare(Student x, Student y)
    {
       switch (this.type)
       {
        case CompareType.Name:
         return x.Name.CompareTo(y.Name);
        case CompareType.Age:
         return x.Age.CompareTo(y.Age);
        default:
         //case CompareType.Grade:
         return x.Grade.CompareTo(y.Grade);
       }
    }
    }
    public class test
    {
    public static void Main()
    {
       List < Student > arr = new List < Student > ();
       arr.Add(new Student("张三", 7, "一年级"));
       arr.Add(new Student("李四", 11, "二年级"));
       arr.Add(new Student("王五", 21, "一年级"));
       arr.Add(new Student("陈六", 8, "三年级"));
       arr.Add(new Student("刘七", 15, "二年级"));
       // 调用Sort方法,实现按年级排序
       arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade));
       // 循环显示集合里的元素
       foreach (Student item in arr)
        Console.WriteLine(item.ToString());
       // 调用Sort方法,实现按姓名排序
       arr.Sort(new StudentComparer(StudentComparer.CompareType.Name));
       // 循环显示集合里的元素
       foreach (Student item in arr)
        Console.WriteLine(item.ToString());
    }
    }
     
     
    本文来源于Asp.net  C# 学习与研究 http://www.k533.net/ , 原文地址:http://www.k533.net/post/icomparer_4484.html
    
    #Base 
    
  • 相关阅读:
    在wampserver环境下配置多个版本的PHP支持
    Jetbrains全系列完美破解--------亲测可用
    python学习笔记1:元组
    python学习笔记0:列表
    入坑:分享几个优秀的编程博客
    java集合-EnumMap与EnumSet
    java集合-TreeSet
    java集合-TreeMap
    java集合-HashMap(JDK1.8)
    java集合-HashSet
  • 原文地址:https://www.cnblogs.com/nanxiaoxiang/p/2751517.html
Copyright © 2011-2022 走看看