LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

如何在 C# 实现和使用 IComparer

admin
2024年11月14日 20:15 本文热度 400

前言

在编程过程中,我们在处理复杂的数据结构或对项目列表进行排序,需要用到对象的比较。在 C# 中,IComparer 与 IComparer<T> 提供了一种灵活而强大的方法来定义自定义比较逻辑,以便可以对它们进行排序。它们功能上相似,只在使用泛型方面有所不同。本文我们探索如何有效地实现和使用它们。

IComparer

1、概述

IComparer 是用于定义比较两个对象方法的接口,在默认排序行为不能满足我们的需求或需要根据自定义条件对对象进行排序。它是在 Collections  命名空间中的,只由单个方法组成。

public interface IComparer{    /// <summary>    /// 比较两个对象 x 与 y    /// </summary>    /// <param name="x">对象 x </param>    /// <param name="y">对象 y </param>    /// <returns>    /// 如果 x 小于 y,则为负整数    /// 如果 x 大于 y,则为正整数    /// 如果 x 等于 y,则为零    /// </returns>    int Compare(object x, object y);}

2、实现

实现 IComparer,我们需要创建一个实现IComparer接口Compare方法的类。根据需要进行排序的自定义比较逻辑,实现该方法。下面通过示例(实现客户集合按地区、再按名称排序)探索如何实现和使用IComparer

  • 定义客户类

我们简化类的定义,只包含编码、名称、地区与构造方法
namespace Fountain.WinConsole.ComparerDemo{    public class Customer    {        public string Code { get; set; }        public string Name { get; set; }        public string City { get; set; }        /// <summary>        ///         /// </summary>        /// <param name="code">编码</param>        /// <param name="name">名称</param>        /// <param name="city">城市</param>        /// <returns></returns>        public Customer(string code, string name, string city)        {            this.Code = code;            this.Name = name;            this.City = city;        }    }}

  • 定义实现 IComparer 的类

实现接口的 Comparer方法, 定义按客户的地区、名称的比较逻辑。
using System;using System.Collections;
namespace Fountain.WinConsole.ComparerDemo{    public class CustomerComparer : IComparer    {        /// <summary>        /// 比较两个对象 x 与 y        /// </summary>        /// <param name="x">对象 x </param>        /// <param name="y">对象 y </param>        /// <returns></returns>        public int Compare(object x, object y)        {            if (x == null || y == null)            {                throw new ArgumentException("参数未引用实例");            }            // 对象 x 转为 Customer            Customer customerx = x as Customer;            // 对象 x 转为 Customer            Customer customery = y as Customer;            if (customerx == null || customery == null)            {                throw new ArgumentException("二个参数不是 Customer 类型");            }            // 先比较城市            int cityComparison = string.Compare(customerx.City, customery.City, StringComparison.OrdinalIgnoreCase);            // 如果城市相等,则再比较名称            if (cityComparison == 0)            {                // 再比较名称                return string.Compare(customerx.Name, customery.Name, StringComparison.OrdinalIgnoreCase);            }            return cityComparison;        }    }}

  • 使用 CustomerComparer 实现排序

使用 CustomerComparer 对客户列表进行排序,定义了客户数组列表。

using System;
namespace Fountain.WinConsole.ComparerDemo{    internal class Program    {        public static void Main()        {            // 创建客户数组列表            var customers = new Customer[]            {                new Customer("Huawei", "华为","深圳"),                new Customer("Dajiang", "大疆", "深圳"),                new Customer("Guangqi", "广汽", "广州"),                new Customer("NanfangDiawang", "中国南方电网", "广州"),                new Customer("Meidi", "美的", "佛山")            };
           // 使用 CustomerComparer 对客户列表进行排序            Array.Sort(customers, new CustomerComparer());
           Console.WriteLine("客户排序按 城市 和 名称排序");
           foreach (var customer in customers)            {                // 出排序结果                Console.WriteLine($"{customer.City}    {customer.Name}");            }            Console.ReadKey();        }    }}

IComparer<T>

1、概述

IComparer<T> 是用于定义比较两个对象方法的泛型接口,这个接口是在 System.Collections.Generic 命名空间中的,只由单个方法组成。

public interface IComparer<T>{    /// <summary>    /// 比较两个对象 x 与 y    /// </summary>    /// <param name="x">对象 x </param>    /// <param name="y">对象 y </param>    /// <returns>    /// 如果 x 小于 y,则为负整数    /// 如果 x 大于 y,则为正整数    /// 如果 x 等于 y,则为零    /// </returns>    int Compare(T x, T y);}

2、实现

实现 IComparer<T>,我们需要创建一个实现IComparer<T>接口Compare方法的类。根据需要进行排序的自定义比较逻辑,实现该方法。下面通过示例(实现客户集合按地区、再按名称排序)探索如何实现和使用IComparer<T>

  • 定义客户类

我们简化类的定义,只包含编码、名称、地区与构造方法。此类已在上面示例给出。

  • 定义实现 IComparer<T> 的类

实现接口的 Comparer方法, 定义按客户的地区、名称的比较逻辑。

using System;using System.Collections.Generic;
namespace Fountain.WinConsole.ComparerDemo{    public class CustomerComparer : IComparer<Customer>    {        /// <summary>        /// 比较两个对象 x 与 y        /// </summary>        /// <param name="customerx">对象 x </param>        /// <param name="customery">对象 y </param>        /// <returns></returns>        public int Compare(Customer customerx, Customer customery)        {            if (customerx == null || customery == null)            {                throw new ArgumentException("二个参数不是 Customer 类型");            }            // 先比较城市            int cityComparison = string.Compare(customerx.City, customery.City, StringComparison.OrdinalIgnoreCase);            // 如果城市相等,则再比较名称            if (cityComparison == 0)            {                // 再比较名称                return string.Compare(customerx.Name, customery.Name, StringComparison.OrdinalIgnoreCase);            }            return cityComparison;        }    }}

  • 使用 CustomerComparer 实现排序

使用 CustomerComparer 对客户列表进行排序,定义客户List列表

using System;using System.Collections.Generic;
namespace Fountain.WinConsole.ComparerDemo{    internal class Program    {        public static void Main()        {            // 创建客户数组列表            var customers = new Customer[]            {                new Customer("Huawei", "华为","深圳"),                new Customer("Dajiang", "大疆", "深圳"),                new Customer("Guangqi", "广汽", "广州"),                new Customer("NanfangDiawang", "中国南方电网", "广州"),                new Customer("Meidi", "美的", "佛山")            };
           // 使用 CustomerComparer 对客户列表进行排序            Array.Sort(customers, new CustomerComparer());
           Console.WriteLine("客户排序按 城市 和 名称排序");
           foreach (var customer in customers)            {                // 出排序结果                Console.WriteLine($"{customer.City}    {customer.Name}");            }
           // 创建客户数组列表            var customerList = new List<Customer>            {                new Customer("Huawei", "华为","深圳"),                new Customer("Dajiang", "大疆", "深圳"),                new Customer("Guangqi", "广汽", "广州"),                new Customer("NanfangDiawang", "中国南方电网", "广州"),                new Customer("Meidi", "美的", "佛山")            };
           Console.WriteLine();
           // 使用 CustomerComparer 对客户列表进行排序            customerList.Sort(new CustomerComparer());            Console.WriteLine("客户排序按 城市 和 名称排序");
           foreach (var customer in customerList)            {                // 出排序结果                Console.WriteLine($"{customer.City}    {customer.Name}");            }            Console.ReadKey();        }    }}

优点

  • 自定义排序: 允许我们按自定义方式比较对象,实现自定义排序;

  • 可重用性: 将比较逻辑封装,可以在应用程序中进行重用;

  • 可维护性: 将比较逻辑与业务逻辑分开,保持代码整洁有序,增加可维护性;

    小结

    以上是 IComparer 和 IComparer<T> 在 C# 中,通过遵循分步实施示例,探索如何有效地实现和使用它们。通过分步实现的示例,我们可以轻松地将它们集成到项目中,并控制对象的排序和比较方式。


    该文章在 2024/11/15 11:55:38 编辑过
    关键字查询
    相关文章
    正在查询...
    点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
    点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
    点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
    点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
    Copyright 2010-2024 ClickSun All Rights Reserved