【C#】 自定义类的比较/排序—IComparer接口、IComparable接口

排序

数组

https://learn.microsoft.com/en-us/dotnet/api/system.array.sort?view=net-7.0

using System;

Array.Sort(Array);				//使用默认比较器
Array.Sort(Array, IComparer);	//使用自定义比较器

定义一个比较器类MySort,继承IComparer接口实现Compare方法,将实例传入Sort函数:

返回值1,将y放在x的左侧
-1将y放在x的右侧
1保持位置不变
不知道怎么写返回值时,写一个调试一下就知道,错了改一下就行。

class mySort: IComparer
    {
        #region IComparer Members
 
        public int Compare(object x, object y)
        {
            Student s1 = x as Student;
            Student s2 = y as Student;
            //return s1.Name.CompareTo(s2.Name);	//默认CompareTo为升序
			if(s1.Age < s2.Age)
				return 1;	//将s2放在s1的左侧,这里s2.Age>s1.Age,所以按Age降序
			else if(s1.Age == s2.Age)
				return 0;
			else
				return -1;
        }
 
        #endregion
    }
static void Main(string[] args)
    {
        Person[] p = new Person[]{
            new Person(10,"zhang"),
            new Person(30,"wang"),
            new Person(40,"fang"),
            new Person(20,"lang"),
        };
       Array.Sort(p, new MySort());

       foreach(var ii in p){
           Console.WriteLine($"age={ii.Age},name={ii.Name}");
       }
    }

    class MySort: IComparer
    {
        #region IComparer Members
 
        public int Compare(object x, object y)
        {
            Person s1 = x as Person;
            Person s2 = y as Person;
            if(s1.Age < s2.Age)
                return 1;
            else if(s1.Age==s2.Age)
                return 0;
            else
                return -1;
        }
 
        #endregion
    }

     public class Person
     {
        public int Age{set;get;}
        public string Name{set;get;}

        public Person(int a, string n){
            this.Age=a;
            this.Name=n;
        }
     }

定义数据类型时继承IComparable接口实现CompareTo方法

这时该数据类型的集合,调用Sort()排序时将按照CompareTo方法指定排序规则进行排序。
int、string、object类型可用CompareTo方法,默认升序。

public class Person:IComparable
    {
        public int Age{set;get;}
        public string Name{set;get;}

        public Person(int a, string n)
        {
            this.Age=a;
            this.Name=n;
        }

        public int CompareTo(object oo)
        {
            Person pp = oo as Person;

            if (Age < pp.Age)
            {
                return -1;
            }
            else if (Age == pp.Age)
            {
                return 0;
            }
            else
            {
                return 1;
            }

            //return this.Age.CompareTo(pp.Age);	//Int.CompareTo()默认升序
        }
    }

List

using System.Collections.Generic;

Sort();				//使用默认比较器	
Sort(IComparer<T>);	//使用自定义比较器
List<Person> ll = new List<Person>();
ll.Add(new Person(10,"zhang"));
ll.Add(new Person(20,"wang"));
ll.Add(new Person(30,"fang"));
ll.Add(new Person(40,"lang"));
ll.Sort();
posted @ 2023-05-09 17:15  徘徊彼岸花  阅读(375)  评论(0编辑  收藏  举报