当前位置: 首页 > news >正文

c# 排序、强转枚举

在这里插入图片描述

List<Tuple<double,int>> mm中doble从小到大排序 mm本身排序

在C#中,如果你有一个List<Tuple<double, int>>类型的集合mm,并且你想要根据Tuple中的double值(即第一个元素)从小到大进行排序,同时希望这个排序能够反映到mm本身(即原地排序),你可以使用List的Sort方法,并传入一个自定义的比较器。

由于Tuple类本身不直接支持比较操作(至少在C# 7.3之前的版本中是这样),你需要定义一个比较器来实现这一点。在C# 7.3及更高版本中,Tuple类支持比较操作,但如果你使用的是旧版本的C#或者想要更明确地控制比较逻辑,定义一个比较器总是一个好选择。

下面是一个如何根据Tuple中的double值对List<Tuple<double, int>>进行排序的示例:

csharp
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
static void Main()
{
List<Tuple<double, int>> mm = new List<Tuple<double, int>>
{
Tuple.Create(3.14, 1),
Tuple.Create(1.59, 2),
Tuple.Create(2.65, 3),
Tuple.Create(4.20, 4),
Tuple.Create(0.00, 5)
};

    // 使用Sort方法和自定义比较器对mm进行排序  mm.Sort((a, b) => a.Item1.CompareTo(b.Item1));  // 输出排序后的mm  foreach (var item in mm)  {  Console.WriteLine($"({item.Item1}, {item.Item2})");  }  
}  

}
在这个示例中,Sort方法接受一个Comparison委托,其中T是列表中的元素类型(在这个例子中是Tuple<double, int>)。Comparison委托需要一个接受两个T类型参数并返回一个整数的函数,该函数根据比较结果返回小于零、零或大于零的值。

在比较器中,我使用了Tuple的Item1属性(即double值)来调用CompareTo方法进行比较。这样,mm就会根据Tuple中的double值进行从小到大的排序了。

c# int转enum

在C#中,将一个int值转换为一个enum(枚举)类型是一个常见的操作。枚举(enum)是一种特殊的值类型,它使变量成为一组命名的整型常量的集合。尽管枚举的底层类型默认是int,但你也可以将其定义为其他整型(如byte、short、long等)。要将int转换为enum,你可以使用类型转换(强制类型转换或隐式转换,具体取决于上下文)。

以下是一个示例,展示了如何将int转换为enum:

首先,定义一个枚举:

csharp
enum Days
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
然后,你可以使用以下任一方法将int转换为Days枚举:

隐式转换(如果枚举成员的值与int值完全匹配)
如果int值直接对应于枚举中的一个成员,则可以使用隐式转换:

csharp
int dayInt = 3;
Days dayEnum = (Days)dayInt; // 显式转换,但在这个例子中实际上是隐式的,因为直接匹配
// 或者,如果编译器能确定类型,可以直接写作
// Days dayEnum = dayInt; // 注意:这通常不直接工作,因为编译器需要明确的上下文

Console.WriteLine(dayEnum); // 输出: Wednesday
显式转换(强制类型转换)
当你不确定int值是否对应枚举中的一个成员时,使用显式转换(也称为强制类型转换)是一个好习惯。这告诉编译器你了解可能的风险,并希望执行转换:

csharp
int dayInt = 9; // 假设这不是枚举中的有效值
Days dayEnum;

try
{
dayEnum = (Days)dayInt; // 尝试转换
Console.WriteLine(dayEnum); // 如果dayInt是有效值,将输出对应的枚举成员名
}
catch (InvalidCastException)
{
Console.WriteLine(“dayInt不是一个有效的Days枚举值。”);
}

// 另一种处理方式是使用Enum.IsDefined来检查值是否有效
if (Enum.IsDefined(typeof(Days), dayInt))
{
dayEnum = (Days)dayInt;
Console.WriteLine(dayEnum);
}
else
{
Console.WriteLine(“dayInt不是一个有效的Days枚举值。”);
}
注意,尝试将未定义在枚举中的int值强制转换为枚举类型时,将会抛出InvalidCastException异常。使用Enum.IsDefined方法可以安全地检查一个int值是否对应于枚举中的一个有效成员,从而避免异常。
参考

c# Enum强制转换为int

在C#中,将Enum(枚举)强制转换为int(或隐式转换为int,因为枚举的底层类型默认是int)是直截了当的。由于枚举本质上是一组命名的整型常量,所以它们可以很容易地与int类型相互转换。

显式转换(强制类型转换)
虽然大多数情况下隐式转换就足够了,但如果你想要明确表示你的意图,或者想要强调转换过程,你可以使用显式转换(也称为强制类型转换)。

csharp
enum Days
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
// … 其他天
}

Days today = Days.Monday;

// 显式转换为int
int dayAsInt = (int)today;

Console.WriteLine(dayAsInt); // 输出: 1
隐式转换
由于枚举的底层类型是int(除非你显式地将其指定为其他整型,如byte、short、long等),所以你可以直接将枚举值赋给int类型的变量,而不需要进行任何显式转换。但请注意,这种隐式转换在代码可读性方面可能不如显式转换那么清晰。

csharp
enum Days
{
Sunday = 0,
Monday = 1,
// … 其他天
}

Days today = Days.Tuesday;

// 隐式转换为int
int dayAsInt = today; // 不需要显式转换

Console.WriteLine(dayAsInt); // 输出: 2
注意事项
当你将int值转换回枚举时,如果int值不是枚举中定义的有效值,那么你将得到一个有效的枚举值,但它可能不是你预期的那个。这是因为枚举值在内部以int形式存储,并且如果提供的值超出了枚举定义的范围,它将简单地回绕到枚举的起始值(或某个其他值,具体取决于枚举的具体实现和.NET版本)。然而,从C# 7.3开始,你可以使用Enum.HasFlag(对于标志枚举)或Enum.IsDefined(对于非标志枚举)来检查一个int值是否对应于枚举中的一个有效成员。
如果你将枚举的底层类型更改为非int类型(如byte、short、long等),则隐式转换和显式转换都将遵循你指定的底层类型。但是,在将枚举值赋给不同底层类型的变量时,你可能仍然需要进行显式转换。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • IS-IS协议
  • 某MDM主数据管理系统与微软Dynamic CRM系统(新加坡节点)集成案例
  • 大模型12:知识图谱 图数据库
  • 深入学习小程序第二天:事件处理与用户交互
  • Android 14 Power键亮灭屏流程
  • 深入理解小程序的渲染机制与性能优化策略
  • 镜像仓库 Registry 介绍及实践-http
  • python-learning47--高阶教程--基础阶段--python函数--高级用法-作用域
  • Java每日一练_模拟面试题6(JVM的GC过程)
  • 网络协议 从入门到精通系列讲解 - 总目录
  • 【rx rb rz】Centos/Linux rx、rb、rz命令详细介绍
  • React应用(基于react脚手架)
  • 攻防世界-web-ctf-upload
  • Ubuntu 安装 Snipaste
  • springboot mybatis plus 固定查询条件及可选查询条件的组合查询,使用QueryWrapper.and()来解决。
  • Google 是如何开发 Web 框架的
  • 3.7、@ResponseBody 和 @RestController
  • axios 和 cookie 的那些事
  • Hibernate【inverse和cascade属性】知识要点
  • Javascript Math对象和Date对象常用方法详解
  • Javascript弹出层-初探
  • Just for fun——迅速写完快速排序
  • Linux中的硬链接与软链接
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Mac转Windows的拯救指南
  • Python连接Oracle
  • Redis字符串类型内部编码剖析
  • SpringBoot 实战 (三) | 配置文件详解
  • Vim 折腾记
  • 对象管理器(defineProperty)学习笔记
  • 和 || 运算
  • 解析 Webpack中import、require、按需加载的执行过程
  • 每天一个设计模式之命令模式
  • 嵌入式文件系统
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #vue3 实现前端下载excel文件模板功能
  • $().each和$.each的区别
  • (13)DroneCAN 适配器节点(一)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (六)Hibernate的二级缓存
  • (十)T检验-第一部分
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Windows2003安全设置/维护
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)我也是一只IT小小鸟
  • .net 无限分类
  • .NET 中的轻量级线程安全