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

Visual C#中如何使用IComparable和IComparer接口

 更新時間:2023年04月26日 15:25:49   作者:wenhx  
這篇文章主要介紹了C#中使用IComparable和IComparer接口,在本例中,該對象被用作第二個參數(shù)被傳遞給Array.Sort的接受IComparer實例的重載方法,需要的朋友可以參考下

本文同時討論了IComparable和IComparer接口,原因有兩點。這兩個接口經(jīng)常一起使用。雖然接口類似且名稱相似,但它們卻有不同的用途。

原文:Use the IComparable and IComparer interfaces in Visual CSharp

本文介紹了在Visual C#中如何使用IComparer和IComparable接口。

概要

本文同時討論了IComparable和IComparer接口,原因有兩點。這兩個接口經(jīng)常一起使用。雖然接口類似且名稱相似,但它們卻有不同的用途。

如果你有一個支持IComparer的類型數(shù)組(例如字符串或整數(shù)),你可以對它進(jìn)行排序而不需要提供任何對IComparer的顯式引用(譯注:意思是把一個IComparer的實現(xiàn)類作為參數(shù)傳遞給排序方法)。在這種情況下,數(shù)組元素會被轉(zhuǎn)換為IComparer的默認(rèn)實現(xiàn)(Comparer.Default)。然而,如果你想為自定義對象提供排序或比較能力,你必須實現(xiàn)這兩個接口中的一個或兩個。

本文引用了Microsoft .NET Framework類庫命名空間System.Collections。

IComparable 接口

IComparable 接口的作用是提供一種比較特定類型的兩個對象的方法。如果你想為你的對象提供任何排序能力,那么這是必須的??梢詫?IComparable 視為為你的對象提供默認(rèn)的排序順序。例如,如果你有一個對象類型的數(shù)組,然后你在該數(shù)組上調(diào)用 Sort 方法,則排序期間的對象比較是由 IComparable 提供的。當(dāng)你實現(xiàn) IComparable 接口時,必須實現(xiàn) CompareTo 方法,如下所示:

// IComparable 的 CompareTo 方法,提供默認(rèn)的排序。
int IComparable.CompareTo(object obj)
{
   Car c=(Car)obj;
   return String.Compare(this.make,c.make);
}

CompareTo 方法中如何進(jìn)行比較取決于被比較值的數(shù)據(jù)類型。在本例中使用 String.Compare方法,因為被選擇用于比較的屬性是字符串。

IComparer 接口

IComparer 接口的作用是提供更多的比較機(jī)制。例如,你可能想要你的類的排序上使用多個字段或?qū)傩?,在同一字段上提供升序和降序,或者兩者兼而有之。(譯注,這個時候就必須要使用IComparer 接口了。)

使用 IComparer 是一個兩步過程。首先,聲明一個實現(xiàn) IComparer 的類,然后實現(xiàn) Compare 方法:

private class SortYearAscendingHelper : IComparer
{
   int IComparer.Compare(object a, object b)
   {
      Car c1=(Car)a;
      Car c2=(Car)b;
      if (c1.year > c2.year)
         return 1;
      if (c1.year < c2.year)
         return -1;
      else
         return 0;
   }
}

注意:

IComparer.Compare 方法需要三元比較。根據(jù)其中一個值是否大于、等于或小于另一個值,返回1、0或-1??梢酝ㄟ^切換此方法中的邏輯運算符來更改排序順序(升序或降序)。

第二步是聲明一個返回IComparer對象實例的方法:

public static IComparer SortYearAscending()
{
   return (IComparer) new SortYearAscendingHelper();
}

在本例中,該對象被用作第二個參數(shù)被傳遞給Array.Sort的接受IComparer實例的重載方法。IComparer的使用并不局限于數(shù)組。它被許多不同的集合和控件類接受為參數(shù)。

逐步講解的示例:

以下示例演示了如何使用這些接口。為了演示IComparer和IComparable,我們創(chuàng)建了一個名為Car的類,該類擁有Make和Year兩個屬性。通過IComparable接口,為Make字段啟用了升序排序;通過IComparer接口,為Make字段啟用了降序排序。通過使用IComparer,為Year屬性提供了升序和降序排序。

1. 在Visual Studio中創(chuàng)建一個新的Console Application項目,把它命名為ConsoleEnum。

2. 將Program.cs重命名為Host.cs,然后用以下代碼替換原有代碼。

using System;
namespace ConsoleEnum
{
    class host
    {
       [STAThread]
       static void Main(string[] args)
       {
          // Create an array of Car objects.
          Car[] arrayOfCars= new Car[6]
          {
             new Car("Ford",1992),
             new Car("Fiat",1988),
             new Car("Buick",1932),
             new Car("Ford",1932),
             new Car("Dodge",1999),
             new Car("Honda",1977)
          };
          // Write out a header for the output.
          Console.WriteLine("Array - Unsorted\n");
          foreach(Car c in arrayOfCars)
             Console.WriteLine(c.Make + "\t\t" + c.Year);
          // Demo IComparable by sorting array with "default" sort order.
          Array.Sort(arrayOfCars);
          Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");
          foreach(Car c in arrayOfCars)
             Console.WriteLine(c.Make + "\t\t" + c.Year);
          // Demo ascending sort of numeric value with IComparer.
          Array.Sort(arrayOfCars,Car.SortYearAscending());
          Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");
          foreach(Car c in arrayOfCars)
             Console.WriteLine(c.Make + "\t\t" + c.Year);
          // Demo descending sort of string value with IComparer.
          Array.Sort(arrayOfCars,Car.SortMakeDescending());
          Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");
          foreach(Car c in arrayOfCars)
             Console.WriteLine(c.Make + "\t\t" + c.Year);
          // Demo descending sort of numeric value using IComparer.
          Array.Sort(arrayOfCars,Car.SortYearDescending());
          Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");
          foreach(Car c in arrayOfCars)
             Console.WriteLine(c.Make + "\t\t" + c.Year);
          Console.ReadLine();
       }
   }
}

3. 在項目中新增一個類,命名為Car。

4. 用下面的代碼替換Car.cs中的代碼。

using System;
using System.Collections;
namespace ConsoleEnum
{
   public class Car : IComparable
   {
      // Beginning of nested classes.
      // Nested class to do ascending sort on year property.
      private class SortYearAscendingHelper: IComparer
      {
         int IComparer.Compare(object a, object b)
         {
            Car c1=(Car)a;
            Car c2=(Car)b;
            if (c1.year > c2.year)
               return 1;
            if (c1.year < c2.year)
               return -1;
            else
               return 0;
         }
      }
      // Nested class to do descending sort on year property.
      private class SortYearDescendingHelper: IComparer
      {
         int IComparer.Compare(object a, object b)
         {
            Car c1=(Car)a;
            Car c2=(Car)b;
            if (c1.year < c2.year)
               return 1;
            if (c1.year > c2.year)
               return -1;
            else
               return 0;
         }
      }
      // Nested class to do descending sort on make property.
      private class SortMakeDescendingHelper: IComparer
      {
         int IComparer.Compare(object a, object b)
         {
            Car c1=(Car)a;
            Car c2=(Car)b;
             return String.Compare(c2.make,c1.make);
         }
      }
      // End of nested classes.
      private int year;
      private string make;
      public Car(string Make,int Year)
      {
         make=Make;
         year=Year;
      }
      public int Year
      {
         get  {return year;}
         set {year=value;}
      }
      public string Make
      {
         get {return make;}
         set {make=value;}
      }
      // Implement IComparable CompareTo to provide default sort order.
      int IComparable.CompareTo(object obj)
      {
         Car c=(Car)obj;
         return String.Compare(this.make,c.make);
      }
      // Method to return IComparer object for sort helper.
      public static IComparer SortYearAscending()
      {
         return (IComparer) new SortYearAscendingHelper();
      }
      // Method to return IComparer object for sort helper.
      public static IComparer SortYearDescending()
      {
         return (IComparer) new SortYearDescendingHelper();
      }
      // Method to return IComparer object for sort helper.
      public static IComparer SortMakeDescending()
      {
        return (IComparer) new SortMakeDescendingHelper();
      }
   }
}

5. 運行項目。Console窗口顯示如下:

Array - Unsorted

Ford 1992
Fiat 1988
Buick 1932
Ford 1932
Dodge 1999
Honda 1977

Array - Sorted by Make (Ascending - IComparable)

Buick 1932
Dodge 1999
Fiat 1988
Ford 1932
Ford 1992
Honda 1977

Array - Sorted by Year (Ascending - IComparer)

Ford 1932
Buick 1932
Honda 1977
Fiat 1988
Ford 1992
Dodge 1999

Array - Sorted by Make (Descending - IComparer)

Honda 1977
Ford 1932
Ford 1992
Fiat 1988
Dodge 1999
Buick 1932

Array - Sorted by Year (Descending - IComparer)

Dodge 1999
Ford 1992
Fiat 1988
Honda 1977
Buick 1932
Ford 1932

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

相關(guān)文章

  • C#基礎(chǔ):Equals()與運算符==的區(qū)別分析

    C#基礎(chǔ):Equals()與運算符==的區(qū)別分析

    本篇文章是對c#中的Equals()與運算符==的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#強(qiáng)制類型轉(zhuǎn)換小結(jié)

    C#強(qiáng)制類型轉(zhuǎn)換小結(jié)

    任何一門編程語言均有相關(guān)數(shù)據(jù)類型。C#也不例外,不過轉(zhuǎn)換過程要注意小類型能轉(zhuǎn)換成大類型,但大類型一般不能轉(zhuǎn)換成小類型,下面小編給大家詳解C#強(qiáng)制類型轉(zhuǎn)換小結(jié),需要的朋友參考下吧
    2017-07-07
  • 詳解Unity日志打印工具功能

    詳解Unity日志打印工具功能

    Unity是一個非?;鸬挠螒蛞妫覀冊匍_發(fā)的時候有的時候要進(jìn)行程序的調(diào)試,下面給大家介紹下Unity日志打印工具功能,感興趣的朋友一起看看吧
    2022-01-01
  • MessageBox的Buttons和三級聯(lián)動效果

    MessageBox的Buttons和三級聯(lián)動效果

    這篇文章主要介紹了MessageBox的Buttons和三級聯(lián)動的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • .net2.0+ Winform項目實現(xiàn)彈出容器層

    .net2.0+ Winform項目實現(xiàn)彈出容器層

    在實際工作中,如果能像菜單一樣彈出自定義內(nèi)容,會方便很多,比如查詢時,比如下拉列表顯示多列信息時,比如在填寫某個信息需要查看一些信息樹時。這個時候自定義彈出界面就顯的非常重要了
    2015-08-08
  • WPF實現(xiàn)手風(fēng)琴式輪播圖切換效果

    WPF實現(xiàn)手風(fēng)琴式輪播圖切換效果

    這篇文章主要為大家詳細(xì)介紹了WPF實現(xiàn)手風(fēng)琴式輪播圖切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#正則表達(dá)式Regex類的用法

    C#正則表達(dá)式Regex類的用法

    這篇文章介紹了C#正則表達(dá)式Regex類的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • js事件模型與自定義事件實例解析

    js事件模型與自定義事件實例解析

    JavaScript一個最簡單的事件模型,需要有事件綁定與觸發(fā),還有事件刪除。本文將對其具體實現(xiàn)代碼進(jìn)行解析,需要的朋友一起來看下吧
    2016-12-12
  • c#數(shù)據(jù)綁定之?dāng)?shù)據(jù)轉(zhuǎn)化為信息的示例

    c#數(shù)據(jù)綁定之?dāng)?shù)據(jù)轉(zhuǎn)化為信息的示例

    這篇文章主要介紹了c#數(shù)據(jù)綁定中的數(shù)據(jù)轉(zhuǎn)化為信息的示例,需要的朋友可以參考下
    2014-04-04
  • Unity?使用tiledmap解析地圖的詳細(xì)過程

    Unity?使用tiledmap解析地圖的詳細(xì)過程

    這篇文章主要介紹了Unity?使用tiledmap解析地圖,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論