目录
1、 IComparer < in T >
概述
IComparer<in T>
接口位于 System.Collections.Generic
命名空间中,用于定义比较两个对象的方法。
它通常用于自定义排序顺序。
接口定义
public interface IComparer<in T>
{
int Compare(T x, T y);
}
- T: 要比较的对象的类型。
IComparer<in T>
是逆变的,这意味着可以使用指定类型或其基类。
方法int Compare(T x, T y);
int Compare(T x, T y);
- 参数:
-x
: 第一个要比较的对象。
-y
: 第二个要比较的对象。 - 返回值:
- 小于 0:x
小于y
- 等于 0:x
等于y
- 大于 0:x
大于y
使用场景
IComparer<T>
接口通常与以下方法一起使用,根据不同的比较器实现排序和查找
List<T>.Sort
List<T>.BinarySearch
Array.Sort
Array.BinarySearch
相关类
Comparer<T>
:IComparer<T>
的默认实现。StringComparer
: 为String
类型实现IComparer<T>
接口。
注意事项
- 建议从
Comparer<T>
类派生,而不是直接实现IComparer<T>
接口,因为Comparer<T>
类提供了默认实现和其他有用的方法。
示例
以下示例展示了如何实现 IComparer<T>
接口来提供多种对标题进行排序的比较器。
- 按照标题序号进行排序
/// <summary>
/// 按照标题的序号进行排序
/// </summary>
/// <typeparam name="T"></typeparam>
public class TitleComparerByVersion<T> : Comparer<String>
{
/// <summary>
/// 比较两个字符串表示的序号大小。
/// </summary>
/// <param name="x">第一个版本号字符串</param>
/// <param name="y">第二个版本号字符串</param>
/// <returns>如果 x 大于 y,返回 1;如果 x 小于 y,返回 -1;相等则返回 0</returns>
public override int Compare(string? x, string? y)
{
if (string.IsNullOrEmpty(x) && string.IsNullOrEmpty(y))
{
return 0;
}
if (string.IsNullOrEmpty(x))
{
return -1;
}
if (string.IsNullOrEmpty(y))
{
return 1;
}
var xOrderStr = x.Split(' ')[0];
var yOrderStr = y.Split(' ')[0];
var xNumList = xOrderStr.Spli