C#IComparable接口用于类型的具体值比较,返回一个Int32整数。
该接口只有一个方法 int CompareTo(object obj);
注意实例obj必须与原来比较的类型一致
参考文档:
https://docs.microsoft.com/zh-cn/dotnet/api/system.icomparable?view=net-5.0
IComparable 接口
定义
命名空间:
程序集:
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;
}
}
}
}
}
}
运行效果如图: