当前位置: 首页 > 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等),则隐式转换和显式转换都将遵循你指定的底层类型。但是,在将枚举值赋给不同底层类型的变量时,你可能仍然需要进行显式转换。

http://www.lryc.cn/news/420414.html

相关文章:

  • “华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析
  • html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90
  • 018 | backtrader回测反转策略
  • 《图解HTTP》全篇目录
  • 基于VS2019(Release_x64)+Qt的软件开发—环境配置
  • 【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识
  • 240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank
  • go在linux上安装
  • 算法日记day 35(动归之分割等和子集|最后一块石头的重量2)
  • FPGA使用sv生成虚拟单音数据
  • Linux shell编程:监控进程CPU使用率并使用 perf 抓取高CPU进程信息
  • Linux网络编程的套接字分析(其一,基本知识)
  • 后端Web开发之Maven
  • 前端创新实践:用JavaScript打造网页扫码新体验
  • AWS CLI命令行
  • 领导力培养的底层逻辑
  • 【MATLAB第107期】基于MATLAB的Morris局部敏感性分析模型(无目标函数)
  • Tomcat搭建JSPServlet
  • 32位定点数和32/64位浮点数的二进制生成方法
  • STM32利用arm-dsp库进行FIR低通滤波【详细】
  • Efficient-KAN 源码详解
  • Jlink commander使用方法(附指令大全)
  • Java SpringBoot实现PDF转图片
  • elasticsearch SQL:在Elasticsearch中启用和使用SQL功能
  • Java 并发编程:线程变量 ThreadLocal
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】018 - init_sequence_f 各函数源码分析(二)
  • LVS原理——详细介绍
  • MYSQL 5.7.36 等保 建设记录
  • fatal: unable to access ‘https://github.com/xxxxx
  • 从零开始的CPP(38)——递归与动态规划