C# 基础 IComparable<in T> 与 IComparer <in T>内容详解、使用场景、示例及区别

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值