C#关于可比较接口IComparable实现泛型T排序,比较功能

C#IComparable接口用于类型的具体值比较,返回一个Int32整数。

该接口只有一个方法 int CompareTo(object obj);

注意实例obj必须与原来比较的类型一致

参考文档:

https://docs.microsoft.com/zh-cn/dotnet/api/system.icomparable?view=net-5.0

IComparable 接口

定义

命名空间:

System

程序集:

mscorlib.dll, System.Runtime.dll

定义由值类型或类实现的特定于类型的通用比较方法,旨在对其实例进行排序。

注解

此接口由其值可以排序或排序的类型实现。 它要求实现类型定义一个方法,该方法 CompareTo(Object) 指示当前实例在排序顺序中的位置是在同一类型的第二个对象之前、之后还是与其相同。 实例的 IComparable 实现由方法(如和)自动调用 Array.SortArrayList.Sort 。

方法的实现 CompareTo(Object) 必须返回 Int32 具有以下三个值之一的,如下表所示。

注解
“值” 含义
小于零 当前实例 CompareTo 在排序顺序中位于方法所指定的对象之前。
此当前实例与方法所指定的对象在排序顺序中出现的位置相同 CompareTo 。
大于零 此当前实例 CompareTo 在排序顺序中跟随方法所指定的对象。

所有数值类型 (如 Int32 、和 Double) 实现 IComparable 。 自定义类型还应提供自己的实现 IComparable 来启用对象实例的排序或排序。

所有的基础数据类型(bool,byte,short,char,int,ulong,double,decimal),字符串(string),日期时间(DateTime),枚举(enum),全局唯一标识符 (GUID)等都实现该接口。

测试程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CompareDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int compareResult = DayOfWeek.Friday.CompareTo(DayOfWeek.Tuesday);
            Console.WriteLine($"枚举比较结果一:【{compareResult}】");
            compareResult = DayOfWeek.Wednesday.CompareTo(DayOfWeek.Saturday);
            Console.WriteLine($"枚举比较结果二:【{compareResult}】");
            Console.WriteLine("测试指定的数据项是否在范围内:");
            double minVal = 3000;
            double maxVal = 4000;
            string itemDesc = "输出功率";
            double power = 3456.78;
            string resultInfo = CheckValue(power, maxVal, minVal, itemDesc);
            Console.WriteLine(string.IsNullOrEmpty(resultInfo) ? "校验通过" : resultInfo);
            resultInfo = CheckValue(2345.6, maxVal, minVal, itemDesc);
            Console.WriteLine(string.IsNullOrEmpty(resultInfo) ? "校验通过" : resultInfo);
            Console.WriteLine("下面测试使用IComparable来实现T类型的冒泡排序");
            int[] array = { 25, 14, 19, 55, 52, 98, 77, 6 };
            Console.WriteLine($"未排序数组的元素是【{string.Join(",", array)}】");
            BubbleSort(array);
            Console.WriteLine($"【升序】排序后数组的元素是【{string.Join(",", array)}】");
            BubbleSort(array, false);
            Console.WriteLine($"【降序】排序后数组的元素是【{string.Join(",", array)}】");
            Console.ReadLine();
        }
        /// <summary>
        /// 检查数据项是否在范围内,如果返回空,说明校验通过。返回非空说明不在范围内
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="val"></param>
        /// <param name="maxVal"></param>
        /// <param name="minVal"></param>
        /// <param name="itemDesc"></param>
        /// <returns></returns>
        public static string CheckValue<T>(T val, T maxVal, T minVal, string itemDesc) where T : IComparable
        {
            if (val.CompareTo(minVal) < 0)
            {
                return $"【{itemDesc}过小】(【{val}】 小于 最小值【{minVal}】)";
            }
            if (val.CompareTo(maxVal) > 0)
            {
                return $"【{itemDesc}过大】(【{val}】 大于 最大值【{maxVal}】)";
            }
            return string.Empty;
        }

        /// <summary>
        /// 冒泡排序
        /// </summary>
        /// <typeparam name="T">一种数据类型,可以进行比较</typeparam>
        /// <param name="array">要排序的数组</param>
        /// <param name="isAscending">是否升序排序:从小到大</param>
        public static void BubbleSort<T>(T[] array, bool isAscending = true) where T : IComparable
        {
            if (array == null)
            {
                throw new ArgumentNullException("参数数组不能为null");
            }
            bool exchangeFactor;
            T temp;
            for (int i = 0; i < array.Length - 1; i++)
            {
                for (int j = 0; j < array.Length - 1 - i; j++)
                {
                    //交换相邻元素的条件
                    exchangeFactor = array[j].CompareTo(array[j + 1]) > 0;
                    //如果是倒序排序,就取反
                    if (!isAscending)
                    {
                        exchangeFactor = !exchangeFactor;
                    }
                    //交换位置
                    if (exchangeFactor)
                    {
                        temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
        }
    }
}

​

运行效果如图:

 

おすすめ

転載: blog.csdn.net/ylq1045/article/details/118681969