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等),则隐式转换和显式转换都将遵循你指定的底层类型。但是,在将枚举值赋给不同底层类型的变量时,你可能仍然需要进行显式转换。
相关文章:
c# 排序、强转枚举
List<Tuple<double,int>> mm中doble从小到大排序 mm本身排序 在C#中,如果你有一个List<Tuple<double, int>>类型的集合mm,并且你想要根据Tuple中的double值(即第一个元素)从小到大进行排序,同…...
“华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析
目录 摘 要: 一、问题重述 二、模型假设 三、符号说明 四、问题一分析与求解 4.1 问题一分析 4.2 模型建立 4.2.1 位置变换模型建立 4.2.4 多平面转换模型建立 4.3 模型求解 4.3.1 问题一图 1 结果 4.3.2 问题一图 2 结果 4.3.3 问题一图 3 结果 4.3.4 问题一图 4 结果 4.4 模…...
html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90
htmlcssjs网页设计 找法网2个页面(带js)ui还原度百分之90 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑…...
018 | backtrader回测反转策略
什么是反转策略? 反转策略(Reversal Strategy)是一种试图捕捉市场价格趋势逆转的交易策略。与趋势跟随策略不同,反转策略的核心理念是“物极必反”,即价格在经过一段时间的单边趋势后,往往会出现逆转的机会…...
《图解HTTP》全篇目录
前言 目前,国内讲解 HTTP 协议的书实在太少了。在我的印象中,讲解网络协议的书仅有两本。一本是《HTTP 权威指南》,但其厚度令人望而生畏;另一本是《TCP/IP 详解,卷 1》,内容艰涩难懂,学习难度…...
基于VS2019(Release_x64)+Qt的软件开发—环境配置
前置博客: 基于C高级编程语言的软件开发随记——环境变量-CSDN博客 (一)一种避免设置大量环境变量的VS2019环境配置方法 Ⅰ 解决方案资源管理器->VC目录->在包含目录/库目录中添加对应的include/lib文件夹($(So…...
【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识
【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识 1. 使用VScode进行SSH远程连接服务器2. 端口映射及实例参考文献 这一博客主要介绍使用VScode进行服务器远程连接及端口映射。 1. 使用VScode进行SSH远程连接服务器 安装V…...
240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank
A. 最终效果 B. 可通过鼠标点击打开文件,但会跳转到about:blank import gradio as gr import subprocessdef open_pptx():pptx_path /Users/liuguokai/Downloads/240528-工业大模型1.pptxtry:subprocess.Popen([open, pptx_path])return "PPTX file opened s…...
go在linux上安装
1.首先要确定Linux架构 uname -m如果你的系统是 armv7l(32-bit ARM),你需要下载 armv6l 版的Go语言。 如果你的系统是 aarch64(64-bit ARM),你需要下载 arm64 版的Go语言。 如果你的系统是 x86_64…...
算法日记day 35(动归之分割等和子集|最后一块石头的重量2)
一、分割等和子集 题目: 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分…...
FPGA使用sv生成虚拟单音数据
FPGA使用sv生成虚拟单音数据 之前一直使用matlab生成虚拟的数据,导出到txt或是coe文件中,再导入到fpga中进行仿真测试。 复杂的数据这样操作自然是必要的,但是平日使用正弦数据进行测试的话,这样的操作不免复杂,今日…...
Linux shell编程:监控进程CPU使用率并使用 perf 抓取高CPU进程信息
0. 概要 本文将介绍一个用于监控一组进程CPU使用率的Shell脚本,,当检测到某进程的CPU使用率超出阈值时,使用 perf 工具抓取该进程的详细信息。 本shell脚本为了能在普通嵌入式系统上运行做了妥协和优化。 1. shell脚本流程的简要图示&#…...
Linux网络编程的套接字分析(其一,基本知识)
文章目录 套接字的类型流套接字数据报套接字原始套接字 套接字地址获取套接字地址 协议族和地址族 套接字的类型 Linux系统的套接字有三类:流套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAM)。 流套接字 用于面向连接…...
后端Web开发之Maven
1.java项目构建工具maven介绍 Maven是apache旗下的一个开源项目。Apache软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源(源代码开放)软件基金会也是一一个专门为支持开源项目而生的非盈利性组织。 apache开源项目…...
前端创新实践:用JavaScript打造网页扫码新体验
引言 简述扫码技术在现代网页应用中的普及和重要性。引入JavaScript实现网页扫码功能的创新性和实用性。 扫码技术概述 介绍扫码技术的原理和在不同平台(如微信、支付宝)的应用。讨论扫码技术对用户体验和业务流程的影响。 JavaScript实现网页扫码的…...
AWS CLI命令行
参考文档:在 macOS 上安裝,更新和卸載 AWS CLI 版本 1 - AWS Command Line Interface...
领导力培养的底层逻辑
领导力就是从人们从他们现在的地方,到他们从未去过的地方的能力--基辛格 ## 1. 领导力的一些观点 ## 2. 五种习惯十大承诺 ## 3. 需要领导的场景 ## 4.0 组织中谁需要领导力 ## 5.0 领导力培养 领导力培养的底层逻辑可以简单描述为以下几个方面: 管理…...
【MATLAB第107期】基于MATLAB的Morris局部敏感性分析模型(无目标函数)
【MATLAB第107期】基于MATLAB的Morris局部敏感性分析模型(无目标函数) 更正: 局部敏感性分析方法 一、原理介绍 1.基本原理: Morris方法采用概率均匀抽样的方式估计每个模型输入因子在输出结果中的重要性,通过比较系…...
Tomcat搭建JSPServlet
一、Tomcat环境搭建 1. 将项目变为Web项目 选中项目,点击Help中的Find Action 搜索Add Framework Support 勾选Web Application 出现这些文件就是成功了 2. 配置Tomcat 点击Edit Configurations 点击加号,选择Tomcat Server Local Deployment栏下点击…...
32位定点数和32/64位浮点数的二进制生成方法
问题由来 定点数和浮点数在嵌入式软件处理和FPGA算法方面使用比较普遍,但是遇到FPGA实现32位定点数的处理,想要仿真时,突然发现全网都在讲浮点数和定点数的格式和理论,几乎没有生成的快捷方法,好在一片文章出现了一点…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
