返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >VisualC#中如何使用IComparable和IComparer接口
  • 295
分享到

VisualC#中如何使用IComparable和IComparer接口

C#IComparable和IComparer接口C#IComparer接口 2023-05-18 05:05:55 295人浏览 薄情痞子
摘要

目录概要IComparable 接口IComparer 接口逐步讲解的示例:本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口

本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不同的用途。

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

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

概要

本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不同的用途。

如果你有一个支持IComparer的类型数组(例如字符串或整数),你可以对它进行排序而不需要提供任何对IComparer的显式引用(译注:意思是把一个IComparer的实现类作为参数传递给排序方法)。在这种情况下,数组元素会被转换为IComparer的默认实现(Comparer.Default)。然而,如果你想为自定义对象提供排序或比较能力,你必须实现这两个接口中的一个或两个。

本文引用了Microsoft .net Framework类库命名空间System.Collections。

IComparable 接口

IComparable 接口的作用是提供一种比较特定类型的两个对象的方法。如果你想为你的对象提供任何排序能力,那么这是必须的。可以将 IComparable 视为为你的对象提供默认的排序顺序。例如,如果你有一个对象类型的数组,然后你在该数组上调用 Sort 方法,则排序期间的对象比较是由 IComparable 提供的。当你实现 IComparable 接口时,必须实现 CompareTo 方法,如下所示:

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

CompareTo 方法中如何进行比较取决于被比较值的数据类型。在本例中使用 String.Compare方法,因为被选择用于比较的属性是字符串。

IComparer 接口

IComparer 接口的作用是提供更多的比较机制。例如,你可能想要你的类的排序上使用多个字段或属性,在同一字段上提供升序和降序,或者两者兼而有之。(译注,这个时候就必须要使用IComparer 接口了。)

使用 IComparer 是一个两步过程。首先,声明一个实现 IComparer 的类,然后实现 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 方法需要三元比较。根据其中一个值是否大于、等于或小于另一个值,返回1、0或-1。可以通过切换此方法中的逻辑运算符来更改排序顺序(升序或降序)。

第二步是声明一个返回IComparer对象实例的方法:

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

在本例中,该对象被用作第二个参数被传递给Array.Sort的接受IComparer实例的重载方法。IComparer的使用并不局限于数组。它被许多不同的集合和控件类接受为参数。

逐步讲解的示例:

以下示例演示了如何使用这些接口。为了演示IComparer和IComparable,我们创建了一个名为Car的类,该类拥有Make和Year两个属性。通过IComparable接口,为Make字段启用了升序排序;通过IComparer接口,为Make字段启用了降序排序。通过使用IComparer,为Year属性提供了升序和降序排序。

1. 在Visual Studio中创建一个新的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

到此这篇关于C#中使用IComparable和IComparer接口的文章就介绍到这了,更多相关C# IComparable和IComparer接口内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: VisualC#中如何使用IComparable和IComparer接口

本文链接: https://lsjlt.com/news/211589.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • VisualC#中如何使用IComparable和IComparer接口
    目录概要IComparable 接口IComparer 接口逐步讲解的示例:本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口...
    99+
    2023-05-18
    C# IComparable和IComparer接口 C# IComparer接口
  • GO语言中接口和接口型函数如何使用
    这篇文章主要讲解了“GO语言中接口和接口型函数如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“GO语言中接口和接口型函数如何使用”吧!// A Getter&nbs...
    99+
    2023-07-05
  • ASP教程中如何使用接口和Shell?
    ASP(Active Server Pages)是一种基于服务器端的动态网页技术,它允许开发人员使用多种编程语言来创建动态网页。在ASP中,接口(interface)和Shell对象都是非常有用的功能,本篇文章将介绍如何在ASP教程中使用它...
    99+
    2023-11-03
    教程 接口 shell
  • Java中如何使用Callable和Future接口详解
    本篇文章给大家分享的是有关Java中如何使用Callable和Future接口详解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Runnable是一个接口,而Thread是Ru...
    99+
    2023-06-20
  • Go语言中如何使用NumPy和Git接口?
    Go语言是一种高效、简洁、安全的编程语言,它在开发Web应用、云计算、网络通信等方面有着广泛的应用。而NumPy和Git则是两个非常流行的工具,分别用于科学计算和版本控制。本文将介绍如何在Go语言中使用NumPy和Git接口,以便更好地进行...
    99+
    2023-07-01
    numy git 接口
  • Golang指针和接口如何使用
    这篇文章主要介绍“Golang指针和接口如何使用”,在日常操作中,相信很多人在Golang指针和接口如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang指针和接口如何使用”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • Java接口如何定义和使用
    本篇内容介绍了“Java接口如何定义和使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引入一方面,有时必须从几个类中派生出一个子类,继...
    99+
    2023-06-30
  • Spring中如何使用Comparator接口
    我们先来回顾下Comparator接口在我们日常开发中的作用,Comparator比较器接口可以将自身传递给排序方法(比如Collections.sort或Arrays.sort),...
    99+
    2024-04-02
  • VB.NET中如何使用IDisplayer接口
    本篇文章为大家展示了VB.NET中如何使用IDisplayer接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。VB.NET还是比较常用的,于是我研究了一下VB.NET IDisplayer接口,在...
    99+
    2023-06-17
  • Python中如何使用UNIX接口?
    Python作为一种高级编程语言,具有广泛的应用场景。它不仅可以完成各种编程任务,还可以与底层系统进行交互。本文将详细介绍Python中如何使用UNIX接口。 一、UNIX接口简介 UNIX接口是一种底层接口,它提供了与操作系统进行交互的方...
    99+
    2023-09-03
    load unix 接口
  • Android中如何使用Parcelable接口
    Android中如何使用Parcelable接口,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 Android Parcelable接口使用方法详解1...
    99+
    2023-05-30
    android parcelable
  • Go:如何在地图和切片中使用接口
    php小编苹果将为大家介绍如何在地图和切片中使用接口。在现代Web开发中,地图和切片是常见的功能需求。而使用接口可以使得地图和切片的操作更加灵活和可扩展。本文将详细解释接口的概念,以及...
    99+
    2024-02-10
  • Java抽象类和接口如何使用
    本文小编为大家详细介绍“Java抽象类和接口如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java抽象类和接口如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是抽象类什么是抽象类呢?抽象类顾名...
    99+
    2023-06-30
  • 如何在PHP中使用WebService接口
    这篇文章将为大家详细讲解有关如何在PHP中使用WebService接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP...
    99+
    2023-06-14
  • 如何在php中使用Laravel接口
    如何在php中使用Laravel接口?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypert...
    99+
    2023-06-14
  • 如何在Java中使用RESTful接口
    如何在Java中使用RESTful接口?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是APIAPI (应用程序编程接口) 两种用法类似jar的使用:A软件将功能打包...
    99+
    2023-06-15
  • java中如何使用HttpClient调用接口
    目录java使用HttpClient调用接口HttpClient 提供的主要的功能直接言归正传了!!!!上代码java的HttpClient调用远程接口使用方法实例java使用Htt...
    99+
    2022-11-13
    java使用HttpClient HttpClient调用接口 java HttpClient
  • 如何使用Comparable接口
    这篇文章主要介绍“如何使用Comparable接口”,在日常操作中,相信很多人在如何使用Comparable接口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Comparable接口”的疑惑有所帮助!...
    99+
    2023-06-17
  • Java中如何同时使用接口、并发和数组?
    Java作为一门高级编程语言,一直以来都是开发人员最受欢迎的语言之一。在Java中,我们可以使用接口、并发和数组来实现各种功能,这三个元素都是Java中非常重要的概念。在本文中,我们将介绍如何同时使用这三个元素来编写高质量的Java代码。 ...
    99+
    2023-10-18
    接口 并发 数组
  • Java中如何打包接口,JavaScript中如何使用?
    Java是一种广泛使用的编程语言,主要用于开发企业级应用程序。在Java中,打包是将一组相关的类和接口组织在一起的过程,以便于在不同的应用程序中重用。在本文中,我们将介绍如何打包Java接口,并在JavaScript中使用它们。 一、Ja...
    99+
    2023-08-03
    打包 接口 javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作