欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C# IComparable和IComparer接口和自定義比較器

 更新時(shí)間:2025年07月27日 10:17:12   作者:My_Pure  
本文主要介紹了詳解C# IComparable和IComparer接口和自定義比較器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

ArrayList里面有一個(gè)方法:

public virtual void Sort(IComparer comparer);
使用指定的比較器對(duì)整個(gè) System.Collections.ArrayList 中的元素進(jìn)行排序。
comparer:比較元素時(shí)要使用的 System.Collections.IComparer 實(shí)現(xiàn)。

啥玩意???

1.Comparer類簡(jiǎn)單介紹

想弄清楚這個(gè),我們先來看看這么一個(gè)類。
在System.Collections名稱空間中,有這么一個(gè)類:Comparer。顧名思義,他可以實(shí)現(xiàn)對(duì)簡(jiǎn)單類型的比較,什么意思呢?來看如下代碼:

int a=1,b=2;

正常情況下,我們要怎樣比較他們的大?。縤f,運(yùn)算符,……?這當(dāng)然可以,不過Comparer已經(jīng)給我們提供了一個(gè)函數(shù),可以直接使用:(需要using System.Collections;)

Console.WriteLine(Comparer.Default.Compare(a,b));

因?yàn)閍<b,所以控制臺(tái)會(huì)輸出-1。(這個(gè)函數(shù)總是返回-1,0,1三個(gè)值。)
這里通過Comparer里的靜態(tài)屬性Default獲得Comparer的實(shí)例調(diào)用了Comparer里的非靜態(tài)函數(shù)Compare。
(還可以比較根據(jù)字母比較兩個(gè)string類型,這里就省略介紹了)

2.自定義比較器,IComparable,IComparer接口

當(dāng)然,這個(gè)類不僅僅只是用來比較兩個(gè)數(shù)的大小的。有時(shí)候我們想直接比較兩個(gè)對(duì)象,但是引用里面的屬性或許比較麻煩。尤其是參考要素過多,不好直接比較的時(shí)候,怎樣才能更高效地比較兩個(gè)對(duì)象呢?這時(shí)候,我們就需要自定義比較器了。
首先來介紹IComparable接口。這個(gè)接口里只有一個(gè)方法CompareTo()。讓你的類實(shí)現(xiàn)這個(gè)接口的CompareTo方法,就可以直接調(diào)用這個(gè)方法和另一個(gè)對(duì)象比較。下面是例子:

public class ClassTest : IComparable
{
  public int intTest;
  public int CompareTo(object obj)
  {
    return intTest-((ClassTest)obj).intTest;
    //這里的代碼可以按需要自己編寫,這里只是一個(gè)簡(jiǎn)單的示例
  }
}

然后就可以直接使用啦:

ClassTest a = new ClassTest(){intTest=1};
ClassTest b = new ClassTest(){intTest=2};
Console.WriteLine(a.CompareTo(b));//輸出-1

Comparer類已經(jīng)為我們提供了IComparer的默認(rèn)實(shí)現(xiàn),但我們?nèi)匀豢梢宰远x它。新建一個(gè)類:(記得using System.Collections;)

public class ClassTestComparer : IComparer
{
  public static IComparer Default = new ClassTestComparer();
  //這里必須使用這樣的定義,將對(duì)象轉(zhuǎn)化為IComparer類型有很大用處,下面會(huì)介紹
  public int Compare(object a,object b)
  {
    return ((ClassTest)a).intTest - ((ClassTest)b).intTest;
    //同樣這里使用最簡(jiǎn)單的示例,但是你可以大放異彩
  }
}

注意,如果用于比較的類和設(shè)定的類不一樣,就會(huì)出現(xiàn)錯(cuò)誤。
使用示例:

ClassTest a = new ClassTest(){intTest=1};
ClassTest b = new ClassTest(){intTest=2};
Console.WriteLine(ClassTestComparer.Default.Compare(a,b));
//結(jié)果是-1

可以發(fā)現(xiàn),這兩個(gè)接口的不同之處在于:IComparable在要比較的對(duì)象的類中實(shí)現(xiàn),可以比較該對(duì)象和另一個(gè)對(duì)象。IComparer在一個(gè)單獨(dú)的類中實(shí)現(xiàn),可以比較任意兩個(gè)對(duì)象(關(guān)鍵是你的設(shè)置)。

3.對(duì)集合排序

當(dāng)然,這兩個(gè)接口還有更強(qiáng)大的用處。我們可以使用這兩個(gè)接口對(duì)集合進(jìn)行排序。還記得前言里的Sort()方法嗎?接下來就以ArrayList為例,介紹如何使用。

ArrayList ClassTests = new ArrayList();
ClassTest a = new ClassTest(){intTest=1};
ClassTest b = new ClassTest(){intTest=2};
ClassTest c = new ClassTest(){intTest=3};
ClassTests.Add(a);
ClassTests.Add(b);
ClassTests.Add(c);
ClassTests.Sort();
//使用無參的Sort,將調(diào)用類中的CompareTo()方法,因?yàn)镃lassTest實(shí)現(xiàn)了這個(gè)方法,所以是可以調(diào)用的。如果沒有實(shí)現(xiàn),編譯器會(huì)報(bào)錯(cuò)。
ClassTests.Sort(ClassTestComparer.Default);
//這將使用Compare()方法對(duì)集合中的元素排序。ClassTestComparer類實(shí)現(xiàn)了這個(gè)方法,并且提供了一個(gè)IComparer類型的屬性。

需要注意的是:

  • 兩個(gè)接口提供的方法返回值都是int類型的,負(fù)數(shù)代表小于,0代表等于,正數(shù)代表大于。所以對(duì)數(shù)字之外的自定義比較器,需要人工設(shè)定什么是“大”,什么是“小”。所以上文示例中兩個(gè)數(shù)直接相減,就可以比較大小。
  • 排序完之后,按照返回的int值,集合是由小到大排列的。
  • 使用無參Sort()時(shí),集合中至少要有一個(gè)類實(shí)現(xiàn)了IComparable,否則會(huì)報(bào)錯(cuò)。
  • 一般來說,都是對(duì)同一個(gè)類進(jìn)行比較。不過,也可以實(shí)現(xiàn)對(duì)不同類比較的代碼,這就看具體需要了。

到此這篇關(guān)于詳解C# IComparable和IComparer接口和自定義比較器的文章就介紹到這了,更多相關(guān)C# IComparable IComparer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick

    unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#實(shí)現(xiàn)移動(dòng)窗體的兩種共方法

    C#實(shí)現(xiàn)移動(dòng)窗體的兩種共方法

    在C#Form窗體設(shè)計(jì)中,如果我們不需要使用默認(rèn)邊框設(shè)計(jì)自己個(gè)性化的窗體,這時(shí)候你會(huì)發(fā)現(xiàn)拖動(dòng)窗體的功能就沒有了,這里需要自己構(gòu)建方法讓用戶可以拖動(dòng)整個(gè)窗體,下面就介紹兩種方法來實(shí)現(xiàn),需要的朋友可以參考下
    2024-09-09
  • C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法

    C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法,可實(shí)現(xiàn)將bmp格式位圖轉(zhuǎn)換成ico格式圖標(biāo)的功能,需要的朋友可以參考下
    2015-06-06
  • c#完美截?cái)嘧址a(中文+非中文)

    c#完美截?cái)嘧址a(中文+非中文)

    c#完美截?cái)嘧址a(中文+非中文),需要的朋友可以參考下
    2012-08-08
  • winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法

    winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法

    這篇文章主要介紹了winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法,涉及C#窗體屬性設(shè)置的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#中使用Join與GroupJoin將兩個(gè)集合進(jìn)行關(guān)聯(lián)與分組

    C#中使用Join與GroupJoin將兩個(gè)集合進(jìn)行關(guān)聯(lián)與分組

    這篇文章主要介紹了C#中使用Join與GroupJoin將兩個(gè)集合進(jìn)行關(guān)聯(lián)與分組,文中分別對(duì)Join和GroupJoin的用法進(jìn)行詳細(xì)說明,需要的朋友可以參考下
    2017-12-12
  • C#如何給PDF文件添加水印

    C#如何給PDF文件添加水印

    這篇文章主要為大家詳細(xì)介紹了C#如何給PDF文件添加水印的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • C#中關(guān)于double.ToString()的用法

    C#中關(guān)于double.ToString()的用法

    這篇文章主要介紹了C#中關(guān)于double.ToString()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 訪問修飾符(C# 編程指南)

    訪問修飾符(C# 編程指南)

    所有類型和類型成員都具有可訪問性級(jí)別,用來控制是否可以在您程序集的其他代碼中或其他程序集中使用它們。您在聲明類型或成員時(shí)使用以下訪問修飾符之一來指定其可訪問性
    2011-02-02
  • C#中的遞歸APS和CPS模式詳解

    C#中的遞歸APS和CPS模式詳解

    這篇文章主要介紹了C#中的遞歸APS和CPS模式詳解,本文講解了累加器傳遞模式、CPS函數(shù)、CPS變換、CPS尾遞歸、尾遞歸與Continuation等內(nèi)容,需要的朋友可以參考下
    2015-04-04

最新評(píng)論