超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

如何在 C# 實(shí)現(xiàn)和使用 IComparer

admin
2024年11月14日 20:15 本文熱度 1085

前言

在編程過程中,我們在處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或?qū)?xiàng)目列表進(jìn)行排序,需要用到對(duì)象的比較。在 C# 中,IComparer 與 IComparer<T> 提供了一種靈活而強(qiáng)大的方法來定義自定義比較邏輯,以便可以對(duì)它們進(jìn)行排序。它們功能上相似,只在使用泛型方面有所不同。本文我們探索如何有效地實(shí)現(xiàn)和使用它們。

IComparer

1、概述

IComparer 是用于定義比較兩個(gè)對(duì)象方法的接口,在默認(rèn)排序行為不能滿足我們的需求或需要根據(jù)自定義條件對(duì)對(duì)象進(jìn)行排序。它是在 Collections  命名空間中的,只由單個(gè)方法組成。

public interface IComparer{    /// <summary>    /// 比較兩個(gè)對(duì)象 x 與 y    /// </summary>    /// <param name="x">對(duì)象 x </param>    /// <param name="y">對(duì)象 y </param>    /// <returns>    /// 如果 x 小于 y,則為負(fù)整數(shù)    /// 如果 x 大于 y,則為正整數(shù)    /// 如果 x 等于 y,則為零    /// </returns>    int Compare(object x, object y);}

2、實(shí)現(xiàn)

實(shí)現(xiàn) IComparer,我們需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)IComparer接口Compare方法的類。根據(jù)需要進(jìn)行排序的自定義比較邏輯,實(shí)現(xiàn)該方法。下面通過示例(實(shí)現(xiàn)客戶集合按地區(qū)、再按名稱排序)探索如何實(shí)現(xiàn)和使用IComparer。

  • 定義客戶類

我們簡化類的定義,只包含編碼、名稱、地區(qū)與構(gòu)造方法
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;        }    }}

  • 定義實(shí)現(xiàn) IComparer 的類

實(shí)現(xiàn)接口的 Comparer方法, 定義按客戶的地區(qū)、名稱的比較邏輯。
using System;using System.Collections;
namespace Fountain.WinConsole.ComparerDemo{    public class CustomerComparer : IComparer    {        /// <summary>        /// 比較兩個(gè)對(duì)象 x 與 y        /// </summary>        /// <param name="x">對(duì)象 x </param>        /// <param name="y">對(duì)象 y </param>        /// <returns></returns>        public int Compare(object x, object y)        {            if (x == null || y == null)            {                throw new ArgumentException("參數(shù)未引用實(shí)例");            }            // 對(duì)象 x 轉(zhuǎn)為 Customer            Customer customerx = x as Customer;            // 對(duì)象 x 轉(zhuǎn)為 Customer            Customer customery = y as Customer;            if (customerx == null || customery == null)            {                throw new ArgumentException("二個(gè)參數(shù)不是 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 實(shí)現(xiàn)排序

使用 CustomerComparer 對(duì)客戶列表進(jìn)行排序,定義了客戶數(shù)組列表。

using System;
namespace Fountain.WinConsole.ComparerDemo{    internal class Program    {        public static void Main()        {            // 創(chuàng)建客戶數(shù)組列表            var customers = new Customer[]            {                new Customer("Huawei", "華為","深圳"),                new Customer("Dajiang", "大疆", "深圳"),                new Customer("Guangqi", "廣汽", "廣州"),                new Customer("NanfangDiawang", "中國南方電網(wǎng)", "廣州"),                new Customer("Meidi", "美的", "佛山")            };
           // 使用 CustomerComparer 對(duì)客戶列表進(jìn)行排序            Array.Sort(customers, new CustomerComparer());
           Console.WriteLine("客戶排序按 城市 和 名稱排序");
           foreach (var customer in customers)            {                // 出排序結(jié)果                Console.WriteLine($"{customer.City}    {customer.Name}");            }            Console.ReadKey();        }    }}

IComparer<T>

1、概述

IComparer<T> 是用于定義比較兩個(gè)對(duì)象方法的泛型接口,這個(gè)接口是在 System.Collections.Generic 命名空間中的,只由單個(gè)方法組成。

public interface IComparer<T>{    /// <summary>    /// 比較兩個(gè)對(duì)象 x 與 y    /// </summary>    /// <param name="x">對(duì)象 x </param>    /// <param name="y">對(duì)象 y </param>    /// <returns>    /// 如果 x 小于 y,則為負(fù)整數(shù)    /// 如果 x 大于 y,則為正整數(shù)    /// 如果 x 等于 y,則為零    /// </returns>    int Compare(T x, T y);}

2、實(shí)現(xiàn)

實(shí)現(xiàn) IComparer<T>,我們需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)IComparer<T>接口Compare方法的類。根據(jù)需要進(jìn)行排序的自定義比較邏輯,實(shí)現(xiàn)該方法。下面通過示例(實(shí)現(xiàn)客戶集合按地區(qū)、再按名稱排序)探索如何實(shí)現(xiàn)和使用IComparer<T>。

  • 定義客戶類

我們簡化類的定義,只包含編碼、名稱、地區(qū)與構(gòu)造方法。此類已在上面示例給出。

  • 定義實(shí)現(xiàn) IComparer<T> 的類

實(shí)現(xiàn)接口的 Comparer方法, 定義按客戶的地區(qū)、名稱的比較邏輯。

using System;using System.Collections.Generic;
namespace Fountain.WinConsole.ComparerDemo{    public class CustomerComparer : IComparer<Customer>    {        /// <summary>        /// 比較兩個(gè)對(duì)象 x 與 y        /// </summary>        /// <param name="customerx">對(duì)象 x </param>        /// <param name="customery">對(duì)象 y </param>        /// <returns></returns>        public int Compare(Customer customerx, Customer customery)        {            if (customerx == null || customery == null)            {                throw new ArgumentException("二個(gè)參數(shù)不是 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 實(shí)現(xiàn)排序

使用 CustomerComparer 對(duì)客戶列表進(jìn)行排序,定義客戶List列表

using System;using System.Collections.Generic;
namespace Fountain.WinConsole.ComparerDemo{    internal class Program    {        public static void Main()        {            // 創(chuàng)建客戶數(shù)組列表            var customers = new Customer[]            {                new Customer("Huawei", "華為","深圳"),                new Customer("Dajiang", "大疆", "深圳"),                new Customer("Guangqi", "廣汽", "廣州"),                new Customer("NanfangDiawang", "中國南方電網(wǎng)", "廣州"),                new Customer("Meidi", "美的", "佛山")            };
           // 使用 CustomerComparer 對(duì)客戶列表進(jìn)行排序            Array.Sort(customers, new CustomerComparer());
           Console.WriteLine("客戶排序按 城市 和 名稱排序");
           foreach (var customer in customers)            {                // 出排序結(jié)果                Console.WriteLine($"{customer.City}    {customer.Name}");            }
           // 創(chuàng)建客戶數(shù)組列表            var customerList = new List<Customer>            {                new Customer("Huawei", "華為","深圳"),                new Customer("Dajiang", "大疆", "深圳"),                new Customer("Guangqi", "廣汽", "廣州"),                new Customer("NanfangDiawang", "中國南方電網(wǎng)", "廣州"),                new Customer("Meidi", "美的", "佛山")            };
           Console.WriteLine();
           // 使用 CustomerComparer 對(duì)客戶列表進(jìn)行排序            customerList.Sort(new CustomerComparer());            Console.WriteLine("客戶排序按 城市 和 名稱排序");
           foreach (var customer in customerList)            {                // 出排序結(jié)果                Console.WriteLine($"{customer.City}    {customer.Name}");            }            Console.ReadKey();        }    }}

優(yōu)點(diǎn)

  • 自定義排序: 允許我們按自定義方式比較對(duì)象,實(shí)現(xiàn)自定義排序;

  • 可重用性: 將比較邏輯封裝,可以在應(yīng)用程序中進(jìn)行重用;

  • 可維護(hù)性: 將比較邏輯與業(yè)務(wù)邏輯分開,保持代碼整潔有序,增加可維護(hù)性;

    小結(jié)

    以上是 IComparer 和 IComparer<T> 在 C# 中,通過遵循分步實(shí)施示例,探索如何有效地實(shí)現(xiàn)和使用它們。通過分步實(shí)現(xiàn)的示例,我們可以輕松地將它們集成到項(xiàng)目中,并控制對(duì)象的排序和比較方式。


    該文章在 2024/11/15 11:55:38 編輯過
    關(guān)鍵字查詢
    相關(guān)文章
    正在查詢...
    點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
    點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
    點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
    點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
    Copyright 2010-2025 ClickSun All Rights Reserved