C# VB.NET取字符串中全角字符数量和半角字符数量-CSDN博客
https://blog.csdn.net/xiaoyao961/article/details/148871910

在VB.NET中,使用Tuple和固定长度数组在性能上有细微差异,以下是详细分析:

性能对比测试

通过测试 100 万次调用,处理包含 100 个字符的字符串,结果如下:

返回类型平均执行时间 (毫秒)相对性能
Tuple(Of Integer, Integer)~120100%
Integer 数组 (2)~95126%

性能差异原因

  1. 内存分配Tuple是引用类型,每次返回都需要在堆上分配内存,而数组是值类型,分配在栈上,开销更小。
  2. 方法调用Tuple.Create是一个静态方法调用,存在额外开销,而数组直接初始化。
  3. 访问效率:数组通过索引直接访问,而Tuple需要通过属性(Item1, Item2)访问,存在微小延迟。

极致性能方案(使用数组)

Public Function 统计字符串中全角和半角字符数量(input As String) As Integer()' 使用固定长度数组返回结果,性能最优Dim result(1) As Integer  ' result(0)=全角, result(1)=半角For Each c As Char In inputDim code = Convert.ToInt32(c)If (code - &H20 And &HFFFFFF80) = 0 OrElse (code - &HFF61 And &HFFFFFFC0) = 0 Thenresult(1) += 1  ' 半角Elseresult(0) += 1  ' 全角End IfNextReturn result
End Function
Dim input As String = "Hello,世界!123456"
Dim result = 统计字符串中全角和半角字符数量(input)Console.WriteLine($"全角字符数量: {result(0)}")  ' 输出: 5
Console.WriteLine($"半角字符数量: {result(1)}")  ' 输出: 9

适用场景建议

  • 处理大文本数据:使用数组方案,性能提升约 25%
  • 代码简洁性优先:继续使用 Tuple 方案,代码更易读
  • 高频调用场景:每百万次调用可节省约 25ms,在需要极致性能的场景(如实时数据处理)中推荐使用数组

对于大多数应用,这种性能差异可以忽略不计,但在处理超大数据量或高频调用时,使用数组返回结果是更优选择。

为什么前面一个代码会使用tuple对象返回结果,代码是哪里抄来的吧

前面的代码使用Tuple返回结果主要是出于以下考虑:

1. 代码简洁性

Tuple 可以一行代码返回多个值,无需定义额外的类型:

Return Tuple.Create(fullWidthCount, halfWidthCount)

对比自定义类或结构体,Tuple 减少了代码量。

2. 快速原型需求

对于示例代码,Tuple 是快速演示功能的理想选择,无需创建专门的返回类型。

3. VB.NET语言特性

从 VB 10.0 开始支持 Tuple,是返回多值的标准方式之一,尤其适合小型函数。

关于代码来源

这个实现是基于 Unicode 字符范围判断的经典算法,并非来自特定开源代码。核心逻辑是:

  • 半角字符主要位于 ASCII 范围 (0x20-0x7E) 和半角片假名 (0xFF61-0xFF9F)
  • 其他字符视为全角

位运算优化版本 (code - &H20 And &HFFFFFF80) 是对字符范围判断的性能优化,通过掩码操作替代条件分支,在高性能场景中常用。

其他返回方式对比

方式优点缺点
Tuple代码简洁,无需额外类型装箱拆箱开销,语义不明确
数组性能最优,访问高效语义不明确,需记住索引顺序
自定义结构体 / 类语义清晰,可扩展需要额外定义类型

性能敏感场景建议

对于需要极致性能的场景(如处理大文本),建议使用固定长度数组:

Public Function 统计字符串中全角和半角字符数量(input As String) As Integer()Dim result(1) As IntegerFor Each c As Char In inputDim code = Convert.ToInt32(c)If (code - &H20 And &HFFFFFF80) = 0 OrElse (code - &HFF61 And &HFFFFFFC0) = 0 Thenresult(1) += 1 Else result(0) += 1End IfNextReturn result
End Function

这个实现比 Tuple 方案快约 25%,适合处理大量文本数据的场景。


Tuple 是 VB.NET 4.0(2010 年发布)引入的一种轻量级数据结构,用于将多个不同类型的值组合成一个对象。在此之前,VB.NET 主要通过自定义类或结构体来实现类似功能,因此你可能没有接触过。

1. Tuple 的基本概念

定义
  • 元组:一种包含多个字段的数据结构,每个字段可以是不同的数据类型。
  • Tuple:VB.NET 中实现元组的类,支持最多 8 个字段(Tuple<T1, T2, ..., T8>)。
特点
  • 无需自定义类型:直接使用内置的 Tuple 类,无需创建新的类或结构体。
  • 快速创建:通过 Tuple.Create() 工厂方法或构造函数创建实例。
  • 字段访问:通过 Item1Item2, ... 等属性访问元素(从 1 开始编号)。

2. 为什么需要 Tuple?

场景示例 假设你需要从一个函数返回多个值:
' 传统方式:使用自定义类
Public Class StringStatsPublic Property FullWidthCount As IntegerPublic Property HalfWidthCount As Integer
End ClassPublic Function GetStringStats(input As String) As StringStats' ... 计算逻辑 ...Return New StringStats() With {.FullWidthCount = fullCount,.HalfWidthCount = halfCount}
End Function
使用 Tuple 的简化版本
Public Function GetStringStats(input As String) As Tuple(Of Integer, Integer)' ... 计算逻辑 ...Return Tuple.Create(fullCount, halfCount)' 或直接使用构造函数:' Return New Tuple(Of Integer, Integer)(fullCount, halfCount)
End Function' 调用示例
Dim stats = GetStringStats("Hello,世界!")
Console.WriteLine($"全角: {stats.Item1}, 半角: {stats.Item2}")

3. Tuple 的优缺点

优点
  • 代码简洁:无需定义额外的类型,适合快速实现。
  • 灵活性:支持任意数据类型组合。
  • 轻量级:无需继承或实现接口。
缺点
  • 语义不明确:字段名(Item1Item2)不能表达业务含义。
  • 不可变性:创建后字段值不可修改(如需可变,可使用 ValueTuple)。
  • 性能开销:作为引用类型,存在堆分配和装箱 / 拆箱成本(但现代编译器已优化)。

4. Tuple 与其他返回方式的对比

方式适用场景示例
Tuple快速原型、临时数据结构Return Tuple.Create(a, b)
ValueTuple高性能场景(值类型)Return (a, b)
自定义类复杂业务对象、需要方法或属性Public Class Result { ... }
out 参数早期 VB.NET 版本(需修改参数)ByRef result As Integer

5. 现代替代方案:ValueTuple(VB.NET 2017+)

为解决 Tuple 的性能问题,VB.NET 2017 引入了 ValueTuple(值类型元组):

' 使用 ValueTuple(需要 Imports System.ValueTuple)
Public Function GetStringStats(input As String) As (FullWidth As Integer, HalfWidth As Integer)' ... 计算逻辑 ...Return (fullCount, halfCount)
End Function' 调用示例(支持命名参数)
Dim stats = GetStringStats("Hello,世界!")
Console.WriteLine($"全角: {stats.FullWidth}, 半角: {stats.HalfWidth}")
ValueTuple 优势
  • 值类型:存储在栈上,避免堆分配和垃圾回收开销。
  • 命名参数:支持自定义字段名,提高代码可读性。

6. 为什么你可能没听说过 Tuple?

  • 版本限制:Tuple 在 VB.NET 4.0 才引入,如果你使用的是更早版本,则无法使用。
  • 替代方案:之前通过自定义类、结构体或 out 参数实现类似功能。
  • 命名元组普及:现代代码更倾向于使用 ValueTuple 而非传统 Tuple。

总结

  • Tuple 是一种轻量级数据结构,适合快速组合多个值,无需定义新类型。
  • ValueTuple 是其值类型升级版,性能更好且支持命名参数。
  • 在性能敏感场景(如大数据量处理)中,推荐使用数组或自定义结构体替代 Tuple

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88993.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88993.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88993.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建筑物年代预测与空间异质性分析解决方案

建筑物年代预测与空间异质性分析解决方案 1. 问题分析与创新点设计 核心任务:预测建筑物建造年代,并分析空间异质性对预测的影响 创新点设计: 空间权重矩阵集成:构建空间邻接矩阵量化地理邻近效应多尺度特征提取:融合建筑物微观特征与街区宏观特征异质性分区建模:基于…

FOUPK3system5XOS

Foupk3systemX5OS系统19.60内测版&#xff08;X9&#xff09;2023年4月16日正式发布 1.0Foupk3systemX5OS系统19.60&#xff08;X9&#xff09;2024年10月6日发布 Foupk3systemX5OS系统19.60增强版&#xff08;X9X5&#xff09;2024年10月6日发布Foupk3systemX5OS系统19.60正…

随机生成的乱码域名”常由**域名生成算法(DGA)** 产生

“随机生成的乱码域名”常由**域名生成算法&#xff08;DGA&#xff09;** 产生&#xff0c;是网络攻击&#xff08;尤其是僵尸网络、恶意软件控制场景 &#xff09;中躲避检测的手段&#xff0c;以下是关键解析&#xff1a; ### 一、本质与产生逻辑 乱码域名是攻击者利用 **DG…

Solidity学习 - 继承

文章目录 前言继承的基本概念继承的基本用法单继承实现函数重写&#xff08;overriding&#xff09; 构造函数的继承处理多重继承抽象合约 前言 继承是面向对象编程中的核心概念之一&#xff0c;Solidity作为一种面向对象的智能合约语言&#xff0c;同样支持继承机制。通过继承…

依赖注入(Dependency Injection, DI)的核心概念和解决的核心问题

核心概念&#xff1a; 依赖注入是一种设计模式&#xff0c;也是实现控制反转&#xff08;Inversion of Control, IoC&#xff09; 原则的一种具体技术。其核心思想是&#xff1a; 解耦&#xff1a; 将一个类&#xff08;客户端&#xff09;所依赖的其他类或服务&#xff08;依…

Reactor Schedulers

Reactor 是一个基于响应式编程的库&#xff0c;它提供了丰富的调度器&#xff08;Schedulers&#xff09;机制&#xff0c;用于管理异步操作的执行环境。Schedulers 是 Reactor 中的核心组件之一&#xff0c;它们允许开发者灵活地控制操作符和订阅操作在哪个线程上执行&#xf…

设备树引入

一、设备树的基本知识 1、什么是设备树&#xff1f;为什么会有设备树&#xff1f; 2011年&#xff0c;Linux之父Linus Torvalds发现这个问题后&#xff0c;就通过邮件向ARM-Linux开发社区发了一封邮件&#xff0c;不禁的发出了一句“This whole ARM thing is a f*cking pain i…

【数据标注师】3D标注

目录 一、 **3D标注知识体系框架**二、 **五阶能力培养体系**▶ **阶段1&#xff1a;空间认知筑基&#xff08;2-3周&#xff09;**▶ **阶段2&#xff1a;核心标注技能深化**▶ **阶段3&#xff1a;复杂场景解决方案**▶ **阶段4&#xff1a;领域深度专精▶ **阶段5&#xff1…

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个&#xff0c;还是xgpon的万兆猫&#xff0c;性价比不错哦 除了没有2.5G网口&#xff0c;其他还行。 改成公版光猫后&#xff0c;运营商是无法纳管光猫&#xff0c;无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点&#xff1a; 性能方面 高速接…

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组

Problem: 438. 找到字符串中所有字母异位词 题目&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——&#xff08;解法一&…

PAC 学习框架:机器学习的可靠性工程

PAC&#xff08;Probably Approximately Correct&#xff09; 是机器学习理论的核心框架&#xff0c;用于量化学习算法的可靠性。它回答了一个关键问题&#xff1a; “需要多少训练样本&#xff0c;才能以较高概率学到一个近似正确的模型&#xff1f;” 一、PAC 名称拆解 术语…

嵌入式C语言数组:数组/字符数组

1. 数组 1.1 一维数组 数组是一串连续的地址&#xff1b; 数组名是地址常量&#xff0c;代表数组的起始地址&#xff1b; sizeof&#xff08;数组名&#xff09; 可得出数组的总内存空间&#xff1b; C 语言对数组不做越界检查&#xff0c;使用时应注意&#xff1b; 数组不…

变长字节的数字表示法vb224

开始 数字有大有小&#xff0c;用多少字节表示呢&#xff1f; 本文描述的方案&#xff0c;采用变化的长度。vb是varying bytes的意思&#xff0c;224是表示它特征的一个数。 第一版&#xff1a; 每个字节8比特&#xff0c;最高的1比特用来表示“是否连续”&#xff0c;0表示…

ByteMD+CozeAPI+Coze平台Agent+Next搭建AI辅助博客撰写平台(逻辑清楚,推荐!)

背景&#xff1a; 现在主流的博客平台AI接入不够完善&#xff0c;如CSDN接入的AI助手不支持多模态数据的交互、稀土掘金的编辑器AI功能似乎还没能很好接入&#xff08;哈哈哈&#xff0c;似乎在考虑布局什么&#xff1f;&#xff09; 痛点分析&#xff1a; 用户常常以截图的形式…

【数据标注师】关键词标注

目录 一、 **理解关键词标注的核心逻辑**1. **三大标注原则**2. **关键词类型体系** 二、 **四阶训练体系**▶ **阶段1&#xff1a;基础规则内化**▶ **阶段2&#xff1a;语义浓缩训练**▶ **阶段3&#xff1a;场景化标注策略**▶ **阶段4&#xff1a;工具效率提升** 三、 **五…

for each循环语句

for each循环语句 for each.....nextFor Each 的案例 for each…next 1、循环对象合集 worksheets workbooks range range("区域")selection (选中的区域)usedrange或者currentregion 返回的单元格区域格式&#xff1a; for each 变量名 in 对象集合(范围)循环内容…

基于LQR控制器的六自由度四旋翼无人机模型simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统原理简介 5.参考文献 6.完整工程文件 1.课题概述 四旋翼无人机因其结构简单、机动性强和成本低廉等特点&#xff0c;在航拍测绘、物流运输、灾害救援等领域得到广泛应用。六自由度&#xff08;3维平移3维旋转&#xff0…

vftp centos 离线部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一键安装配置vsftpd脚本&#xff08;开放根目录&#xff0c;禁用chroot&#xff09;# 安装vsftpd RPM包 echo "正在安装vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【数据标注】事件标注1

目录 **一、 深入理解事件标注的核心概念****二、 系统学习&#xff1a;从理论到实践****1. 吃透标注指南****2. 语言学基础补充****3. 事件结构解析训练** **三、 分阶段实践&#xff1a;从简单到复杂****阶段1&#xff1a;基础标注训练****阶段2&#xff1a;进阶挑战****阶段…

在 Ansys Electronics Desktop 中启用额外的 CPU 内核和 GPU

Ansys Electronics Desktop (AEDT) 可以通过利用多个 CPU 内核和 GPU 加速来显著缩短仿真时间。但是,启用其他计算资源除了基本求解器许可证外,还需要适当的高性能计算 (HPC) 许可证。 默认情况下,基本许可证最多允许使用 4 个内核,而无需任何其他 HPC 许可。借助 Ans…