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