C#内建接口:IComparable

news/2024/4/24 21:37:40/

目录

一、介绍

二、示例

注意:Array.Sort(people);调用了CompareTo方法

注意:WriteLine输出会调用ToString

三、笔试题实战


一、介绍

IComparable是一个接口,它定义了一个用于比较对象的方法CompareTo。在C#中,IComparable接口可以被实现,以便在需要比较对象的场合使用,例如在排序算法中。

二、示例

以下是一个实现了IComparable接口的C#代码示例:

using System;public class Person : IComparable<Person>
{public string Name { get; set; }public int Age { get; set; }public int CompareTo(Person other){if (other == null) return 1;// Compare the age firstint result = Age.CompareTo(other.Age);// If the ages are equal, compare the namesif (result == 0){result = Name.CompareTo(other.Name);}return result;}
}// Usage:
var people = new Person[] {new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 },new Person { Name = "Charlie", Age = 20 }
};Array.Sort(people);foreach (var person in people)
{Console.WriteLine("{0} ({1})", person.Name, person.Age);
}

在上面的代码中,我们定义了一个Person类,它实现了IComparable<Person>接口,并实现了CompareTo方法。在CompareTo方法中,我们首先按照年龄进行比较,如果年龄相同,则按照名字进行比较。

在主函数中,我们定义了一个包含三个Person对象的数组,并使用Array.Sort方法对数组进行排序。由于Person类实现了IComparable接口,因此Array.Sort方法可以根据CompareTo方法对数组进行排序。最后,我们使用foreach循环打印排序后的结果。

注意:Array.Sort(people);调用了CompareTo方法

Array.Sort(people)会调用实现了IComparable<T>接口的类的CompareTo方法来进行排序。在上面的示例代码中,我们实现了Person类的CompareTo方法,因此Array.Sort(people)会调用Person类的CompareTo方法来比较Person对象的大小,并进行排序。具体来说,Array.Sort方法在排序时会将数组中的元素两两比较,使用CompareTo方法来确定它们的大小关系,然后进行交换,直到整个数组排序完成。因此,在使用Array.Sort方法对实现了IComparable<T>接口的类的数组进行排序时,CompareTo方法会被自动调用。

升级一下代码:我们可以在Person类中重写ToString方法来输出Person对象的字符串表示形式,从而在输出people数组时使用。下面是一个示例代码:

using System;public class Person : IComparable<Person>
{public string Name { get; set; }public int Age { get; set; }public int CompareTo(Person other){if (other == null) return 1;// Compare the age firstint result = Age.CompareTo(other.Age);// If the ages are equal, compare the namesif (result == 0){result = Name.CompareTo(other.Name);}return result;}public override string ToString(){return $"{Name} ({Age})";}
}// Usage:
var people = new Person[] {new Person { Name = "Alice", Age = 25 },new Person { Name = "Bob", Age = 30 },new Person { Name = "Charlie", Age = 20 }
};Array.Sort(people);foreach (var person in people)
{Console.WriteLine(person);
}

在上面的代码中,我们在Person类中重写了ToString方法,以便输出Person对象的字符串表示形式。在主函数中,我们定义了一个包含三个Person对象的数组,并使用Array.Sort方法对数组进行排序。然后,我们使用foreach循环遍历排序后的数组,并输出每个Person对象的字符串表示形式,这里会自动调用ToString方法。因此,在输出people数组时,我们可以重写ToString方法来定制输出的格式。

注意:WriteLine输出会调用ToString

当我们使用Console.WriteLine输出一个对象时,会自动调用该对象的ToString方法来获取它的字符串表示形式,并输出到控制台。如果该对象没有重写ToString方法,则默认使用该对象的完全限定类型名作为字符串表示形式。

下面是一个示例代码,演示了Console.WriteLine如何调用对象的ToString方法:

using System;public class Person
{public string Name { get; set; }public int Age { get; set; }
}// Usage:
var person = new Person { Name = "Alice", Age = 25 };
Console.WriteLine(person);

在上面的代码中,我们定义了一个Person类,并创建了一个Person对象。然后,我们使用Console.WriteLine输出该对象。由于Person类没有重写ToString方法,因此默认使用Person类的完全限定类型名作为该对象的字符串表示形式。因此,输出的结果为:"Person"。

如果我们在Person类中重写ToString方法,可以自定义该对象的字符串表示形式。例如,下面的代码重写了Person类的ToString方法:

public class Person
{public string Name { get; set; }public int Age { get; set; }public override string ToString(){return $"{Name} ({Age})";}
}// Usage:
var person = new Person { Name = "Alice", Age = 25 };
Console.WriteLine(person);

在上面的代码中,我们在Person类中重写了ToString方法,将该对象的字符串表示形式设置为"Name (Age)"的格式。因此,输出的结果为:"Alice (25)"。

综上所述,当我们使用Console.WriteLine输出一个对象时,会自动调用该对象的ToString方法来获取它的字符串表示形式,并输出到控制台。如果我们希望自定义该对象的字符串表示形式,可以在类中重写ToString方法。

三、笔试题实战

网易互娱雷火事业群笔试-游戏研发工程师(第二批)

1.

矩形排序

【注意:本题按通过的Case比例给分】

给定N个矩形,每个矩形宽W米高H米

请按以下规则将这N个矩形排序,输出排序后的矩形列表

排序规则:
面积小的矩形排在面积大的矩形前面
面积相同的矩形,按照宽高比排序,宽高比大的矩形排在宽高比小的矩形前面
宽高比的定义为 min(W/H, H/W)
面积和宽高比都相同的矩形,按照宽排序,宽度更小的矩形排在宽度更大的矩形前面
 

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32M,其他语言64M

输入描述:

每组输入两行输入第一行是一个整数N (0 < N <= 100)第二行是2*N个整数,分别是每个矩形的宽W和高H,(0 < W,H <= 100)

输出描述:

每组数据输出一行,2*N个整数,分别是排序后的每个矩形的宽W和高H

示例1

输入例子:

2
2 2 1 1

输出例子:

1 1 2 2
using System;class Rectangle : IComparable<Rectangle>
{public int width;public int height;public Rectangle(int w, int h){width = w;height = h;}public int CompareTo(Rectangle other){int area = width * height;int otherArea = other.width * other.height;if (area != otherArea){return area - otherArea;}double aspectRatio = Math.Min((double)width / height, (double)height / width);double otherAspectRatio = Math.Min((double)other.width / other.height, (double)other.height / other.width);if (aspectRatio != otherAspectRatio){return otherAspectRatio.CompareTo(aspectRatio);}return width - other.width;}public override string ToString(){return width + " " + height;}
}class Program
{static void Main(string[] args){int n = int.Parse(Console.ReadLine());string[] input = Console.ReadLine().Split();Rectangle[] rectangles = new Rectangle[n];for (int i = 0; i < n; i++){int w = int.Parse(input[i * 2]);int h = int.Parse(input[i * 2 + 1]);rectangles[i] = new Rectangle(w, h);}Array.Sort(rectangles);for (int i = 0; i < n; i++){Console.Write(rectangles[i] + " ");}}
}

首先定义了一个 Rectangle 类来表示矩形,并实现了 IComparable 接口用于比较两个矩形的大小关系。

CompareTo 方法中,首先比较矩形面积大小,如果面积不同则直接比较面积大小。如果面积相同,则计算矩形的宽高比,宽高比大的矩形排在前面。如果宽高比也相同,则比较矩形的宽度大小。

Main 方法中,读入输入并创建 Rectangle 对象数组。调用 Array.Sort 方法进行排序,最后输出排序后的结果。

注意在输出时需要重写 ToString 方法来返回矩形的宽高字符串表示。


http://www.ppmy.cn/news/47636.html

相关文章

第31天-贪心-第八章 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

文章目录 1. 买卖股票的最佳时机2. 跳跃游戏3. 跳跃游戏 || 1. 买卖股票的最佳时机 - LeetCode链接 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股…

PHP快速入门09-正则相关,附一定要学会的20个高频使用案例

文章目录 前言一、正则表达式介绍二、正则高频案例20个2.1 检查字符串是否以字母开头2.2 检查字符串是否以数字开头2.3 检查字符串是否包含特定字符2.4 检查字符串是否以特定字符结尾2.5 检查字符串是否为纯数字2.6 检查字符串是否为纯字母2.7 检查字符串是否为有效的电子邮件地…

C/C++每日一练(20230417)

目录 1. 字母异位词分组 &#x1f31f;&#x1f31f; 2. 计算右侧小于当前元素的个数 &#x1f31f;&#x1f31f;&#x1f31f; 3. 加一 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 J…

前端开发中性能优化之较少http请求(缓存策略)

1.实现减少http请求逻辑如下 定义了一个fetchData函数&#xff0c;用于发起HTTP请求并返回响应结果。函数的实现逻辑如下&#xff1a; 将请求参数对象params转换为字符串&#xff0c;作为缓存对象的键cacheKey。 如果缓存对象中已经有该请求参数对应的结果&#xff0c;直接返回…

实在智能获评十大数字经济风云企业,2022余杭数字经济“群英榜”发布

4月17日&#xff0c;经专家评审、公开投票&#xff0c;由中共杭州市余杭区委组织部&#xff08;区委两新工委&#xff09;、中共杭州市余杭区经济和信息化局委员会主办评选的2022年度余杭区数字经济“群英榜”正式公示。其中&#xff0c;实在智能成功获评十大数字经济风云企业之…

Linux 操作系统中应该掌握的知识

下面是我从业整理的一部分需要掌握的内容&#xff1a; 1. 基本命令行操作 基本命令行操作&#xff1a;包括文件管理、进程管理、用户权限等方面的基本命令行操作。 下面是文件管理、进程管理和用户权限相关的一些命令和内容&#xff1a; 1.1 文件管理 ls&#xff1a;显示当…

嵌入式Linux(5):物理地址到虚拟地址映射

文章目录 理论知识1、使能了MMU以后有什么好处呢&#xff1f;2、MMU非常复杂&#xff0c;那么我们如何完成物理地址到虚拟地址的转换呢&#xff1f;3、如何查看哪些物理地址被映射过了呢&#xff1f;实例(RK3568) 理论知识 在Linux上面如果想要操作硬件&#xff0c;需要先把物…

python基础复习

文章目录 **string**boolList元组set字典bytes类型f-string条件控制语句ifMatch...case python推导式列表推导式字典推导式元组推导式 迭代器传递参数面向对象类默认函数不定长函数 Lambda 时隔一年捡起来&#xff0c;通过Python3 基本数据类型 | 菜鸟教程 (runoob.com)速刷 st…

酷雷曼一站式图片直播,助力品牌高效传播

传统模式下&#xff0c;摄影师拍摄会议、活动现场的照片后&#xff0c;一般需要7-10天时间才能完成成片交付&#xff0c;而实际上&#xff0c;由于新闻宣传的即时性&#xff0c;照片延迟交付&#xff0c;远远不能满足客户的需求。因此&#xff0c;即时图片直播技术应运而生&…

ROS学习第十节——参数服务器

前言&#xff1a;本小节主要是对于参数服务器参数的修改&#xff0c;需要掌握操作参数的函数使用 1.基本介绍 参数服务器实现是最为简单的&#xff0c;该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (参数设置者)Listener (参数调用者) ROS Master …

Linux编译器 gcc与g++

Linux编译器 gcc/g工具 目录 Linux编译器 gcc/g工具1、程序的诞生2、gcc工具2.1 预处理2.2 编译2.3 汇编2.4 链接2.5 运行2.6 总结 3、静态链接与动态链接3.1 静态链接3.2 动态链接3.3 Linux下库的命名 1、程序的诞生 程序的编译过程&#xff1a; 1、预处理&#xff08;头文件包…

嵌入式学习笔记——SPI通信的应用

SPI通信的应用 前言屏幕分类1.3OLED概述驱动芯片框图原理图通信时序显示的方式页地址、列地址初始化指令 程序设计初始化代码初始化写数据与写命令清屏函数 初始化代码字符显示函数 总结 前言 上一篇中介绍了STM32的SPI通信&#xff0c;并根据框图和寄存器进行了SPI通信的初始…

Microsoft Power Pages部署方案

目录 前言 一、环境准备 二、创建Power Pages应用程序 三、部署Power Pages应用程序

【靶场设计和渗透】

目录 一、前言 二、靶场设计 1、局域网 2、说明 三、渗透测试 1、信息收集 2、漏洞利用 四、后渗透利用 1、提权 2、权限维持 一、前言 为了深入贯彻学习网络安全法律法规&#xff0c;深入学习渗透测试知识&#xff0c;强化实战技能............ 编不出来了&#xff…

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了&#xff0c;No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候&#xff0c;发现man什么都查不了。不管是系统接口还是函数&#xff0c;都显示没有入口文档&#xff08;No manual entry for&#xff09;…

HttpServletResponse注意事项和细节和原理示意图

目录 HttpServletResponse HttpServletResponse 介绍 HttpServletResponse 类图 向客户端返回数据方法 处理中文乱码问题-方案 处理中文乱码问题-方案 2 请求重定向 请求重定向原理示意图 应用实例 DownServlet Java类 DownServletNew.java xml配置 请求重定向注意…

被裁员了,要求公司足额补缴全部公积金,一次补了二十多万!网友兴奋了,该怎么操作?...

被裁员后&#xff0c;能要求公司补缴公积金吗&#xff1f; 一位网友问&#xff1a; 被裁员了&#xff0c;要求公司把历史公积金全部足额缴纳&#xff0c;现在月薪2.3万&#xff0c;但公司每个月只给自己缴纳300元公积金&#xff0c;结果一次补了二十多万&#xff0c;一次性取出…

MySQL索引的底层结构

mysql索引的底层结构 MySQL中的索引索引的底层数据结构索引的类型普通索引主键索引唯一索引全文索引如何选择索引从表面的基本特性考虑性能和底层来分析 覆盖索引的定义回表操作 最左匹配原则 MySQL中的索引 本质是一种‘排好序的数据结构’&#xff0c;可以帮助快速查找数据。…

java基础——常用API,自定义泛型、collection接口

常用API、正则表达式&#xff0c;泛型、Collection集合API 第一章 DateFormat类 java.text.DateFormat 是日期/时间格式化子类的抽象类&#xff0c;我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。 格式化&#xff1…

配置FTP/TFTP协议的ASPF

在多通道协议和NAT的应用中&#xff0c;ASPF是重要的辅助功能。通过配置ASPF功能&#xff0c;实现内网正常对外提供FTP和TFTP服务&#xff0c;同时还可避免内网用户在访问外网Web服务器时下载危险控件。 组网需求 如图1所示&#xff0c;FW部署在某公司的出口&#xff0c;公司提…