c#类型转换和常见集合类型

目录

1. 整数转换,整数和字符串,字符串和整数之间的转换怎么实现?

2. 日期转换,获取当前日期,字符串转日期,日期转字符串怎么实现?

3. 举例一维、二维、三维数组

4. 需求:有个88笔费用记录,总额3亿,金额在300万~800万之间,随机数如何实现?并记录总耗时

5. 简述常见的集合类型的存储结构和它们的作用以及优缺点,并写出实现案例

1)List

2)Array

3)ArrayList

4)LinkedList


1. 整数转换,整数和字符串,字符串和整数之间的转换怎么实现?

字符串转整型:

1)使用int.Parse()方法:这个方法尝试将字符串参数转换为整数。如果字符串不是有效的整数表示,则会抛出FormatException。如果字符串表示的数字超出了int类型的范围,则会抛出OverflowException

2)Convert.ToInt32(str) 方法用于将字符串(str)转换为32位整数(int)。如果字符串str包含的是一个有效的整数值(在int类型的范围内),那么这个方法会成功地将它转换为int类型。如果字符串不是一个有效的整数值,或者其表示的数值超出了int类型的范围,那么这个方法会抛出异常。

string str = "123";
//第一种方式
int a = int.Parse(str);
Console.WriteLine(a + 10);
//Console.WriteLine("123"+2);
//Console.WriteLine(123+2);
//第二种方式
int b = Convert.ToInt32(str);
Console.WriteLine(b + 1);

整型转字符串,有两种方式:

1)任何类型与字符串连接,结果都是字符串

2)使用ToString()方法:这是将整数转换为字符串的最直接方法

int n = 123;
//第一种方式:任何类型与字符串连接,结果都是字符串
Console.WriteLine(""+n);
//第二种方式
Console.WriteLine(Convert.ToString(n));

2. 日期转换,获取当前日期,字符串转日期,日期转字符串怎么实现?

字符串转日期:将字符串转换为DateTime类型,可以使用DateTime.ParseDateTime.TryParse(后者更安全,因为它不会抛出异常)。

string s = "2024-07-04 09:49:03";
DateTime dt = DateTime.Parse(s);
Console.WriteLine(dt.ToString());

获取当前日期:可以使用DateTime.Now来获取当前的日期和时间(包括时、分、秒等)。

DateTime currentDateTime = DateTime.Now;
Console.WriteLine(currentDateTime.ToString());

日期转字符串:将DateTime对象转换为字符串,可以使用ToString方法,并可选地指定一个格式字符串。

DateTime dt2 = new DateTime(2024, 7, 4, 9, 51, 09);
Console.WriteLine(dt2.ToString());

DateTime dt3 = new DateTime(2024, 10, 11);
Console.WriteLine(dt3.ToString());

Console.WriteLine(dt.Year.ToString());
Console.WriteLine(dt.Month.ToString());
Console.WriteLine(dt.Day.ToString());

3. 举例一维、二维、三维数组

在C#中,数组是一种数据结构,用于在内存中连续存储相同类型的数据。数组可以有多个维度,常见的一维、二维和三维数组分别用于存储线性、矩阵和三维空间中的元素。

一维数组:

一维数组是最简单的数组形式,它像一个列表,可以存储一系列的元素。

//声明数组,值类型都有默认值
int[] a1 = new int[3];
for (int i = 0; i < a1.Length; i++)
{
    a1[i] = i;
}
for (int i = 0; i < a1.Length; i++)
{
    Console.Write(a1[i]+" ");
}
Console.WriteLine();
//声明时,同时进行初始化
int[] a2 = new int[3] {1,2,3};
foreach (int i in a2)
{
    Console.Write(i+" "); 
}
Console.WriteLine();

int[] a3 = { 1, 2, 3 };
foreach (int i in a3)
{
    Console.Write(i + " ");
}
Console.WriteLine()

二维数组:

二维数组用于存储矩阵或表格中的数据,每个元素由两个索引(行和列)来访问。

//声明一个二维数组(静态数组)
int[] a1 = { 1, 2, 3, 4, 5, 6 };
//声明一个两行,三列的二维数组
int[,] a2 = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };
//修改某个值
a2[0, 1] = 200;
//获取某维度的长度,不是总的长度,GetLength(n维度),维度从0开始
for (int i = 0; i < a2.GetLength(0); i++)
{
    for (int j = 0; j < a2.GetLength(1); j++)
    {
        Console.Write(a2[i,j] + " "); 
    }
    Console.WriteLine();
}

三维数组:

三维数组用于存储三维空间中的数据,如立方体中的值,每个元素由三个索引(通常是x, y, z)来访问。

//声明一个三维数组
int[,,] a3 = new int[2, 2, 2]
{
    {
        {1,2}, 
        {3,4}
    },
    {
        {5,6},
        {7,8}
    }

};
a3[0, 0, 0] = 100;
a3[1, 1, 1] = 999;

for (int i = 0; i < a3.GetLength(0); i++)
{
    for (int j = 0; j < a3.GetLength(1); j++)
    {
        for (int k = 0; k < a3.GetLength(2); k++)
        {
            Console.Write(a3[i,j,k] + " ");
        }
        Console.WriteLine();
    }
    Console.WriteLine();
}

4. 需求:有个88笔费用记录,总额3亿,金额在300万~800万之间,随机数如何实现?并记录总耗时

想要生成一个包含88笔费用记录的数组,总额需要达到3亿,且每笔金额在300万到800万之间(包括300万和800万),可以使用Random类来生成随机数,并使用循环来构建数组。同时,可以使用Stopwatch类来记录整个过程的总耗时。

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopwatch = Stopwatch.StartNew();
        Random random = new Random();
        int totalRecords = 88;
        long totalAmountNeeded = 300000000; // 3亿  
        long[] expenses = new long[totalRecords];
        long currentTotal = 0;

        // 初步分配费用,尽量平均分配  
        for (int i = 0; i < totalRecords - 1; i++)
        {
            // 为了避免最后一笔费用过小,我们可以先计算一个平均金额,然后在此基础上加上或减去一个随机数  
            long average = totalAmountNeeded / totalRecords;
            // 允许一定的波动,但不超过平均金额的10%  
            long fluctuation = random.Next((int)-(average / 10), (int)((average / 10) + 1)); 
            long amount = average + fluctuation;

            // 确保金额在合理范围内  
            amount = Math.Max(3000000, Math.Min(amount, 8000000));

            expenses[i] = amount;
            currentTotal += amount;
        }

        // 计算最后一笔费用,确保总额达到或稍微超过3亿  
        long lastAmount = totalAmountNeeded - currentTotal;
        // 如果最后一笔费用小于最小金额,则将其设置为最小金额  
        expenses[totalRecords - 1] = Math.Max(3000000, lastAmount);

        stopwatch.Stop();

        // 输出总耗时  
        Console.WriteLine($"总耗时: {stopwatch.ElapsedMilliseconds} 毫秒");

        // 输出费用数组  
        foreach (var expense in expenses)
        {
            Console.Write(expense +"  ");
        }

        // 验证总额
        long actualTotal = 0;
        foreach (var expense in expenses)
        {
            actualTotal += expense;
        }
        Console.WriteLine($"总金额: {actualTotal}");
    }
}

运行后的结果如图:

5. 简述常见的集合类型的存储结构和它们的作用以及优缺点,并写出实现案例

1)List<T>
  • 存储结构:基于数组实现,支持动态扩容。
  • 作用:用于存储元素的序列,支持随机访问。
  • 优点:访问速度快(通过索引访问),支持动态扩容。
  • 缺点:在列表中间插入或删除元素时效率较低,因为需要移动其他元素。
//<>泛型,编译器编译时可以进行类型的检查
List<int> list = new List<int>();
list.Add(100);
//list.Add("200"); //泛型在编译时就进行类型的检查,防止运行时报错
list.Add(200);
list.Add(300);
list.Add(900);
list.Add(400);

Console.WriteLine("容量:{0}",list.Capacity);
Console.WriteLine("元素的个数:{0}",list.Count);
list.Remove(200);
list.RemoveAt(1);
list.Sort();
foreach (int item in list)
{
    Console.WriteLine(item);
}
2)Array
  • 存储结构:固定大小的连续内存块。
  • 作用:用于存储固定数量的同类型元素,支持随机访问。
  • 优点:访问速度快,因为元素在内存中是连续的。
  • 缺点:大小固定,不支持动态扩容。
int[] numbers = new int[3] { 1, 2, 3 };  
Console.WriteLine(numbers[1]); // 输出 2
3)ArrayList
  • 存储结构:ArrayList是一个非泛型集合,内部通过动态数组实现,可以存储不同类型的对象。
  • 作用:ArrayList在泛型集合出现之前广泛使用,用于存储和操作动态数组的元素。
  • 优点(相较于List<T>):可以存储不同类型的对象。
  • 缺点
    • 性能开销:由于需要存储不同类型的对象,可能存在内存分配和类型转换的性能开销。
    • 强制类型转换:访问元素时需要进行类型转换,增加了出错的可能性。
ArrayList arrayList = new ArrayList();
//添加一个元素
arrayList.Add(700);
arrayList.Add(200);
arrayList.Add(300);
arrayList.Add(800);
//超过申请的内存空间,翻倍(自动扩容,扩容策略:翻倍,2的倍数)
arrayList.Add(500);
//删除元素
arrayList.Remove(100);//代码的容错性
arrayList.RemoveAt(0); //索引值来删除
arrayList.RemoveAt(0); //索引值来删除

Console.WriteLine("动态数组的容量:{0}", arrayList.Capacity);
Console.WriteLine("动态数组的元素的个数:{0}", arrayList.Count);

arrayList.Sort(); //排序:从小到大
arrayList.Clear(); //清空

foreach (int item in arrayList)
{
    Console.WriteLine(item);
}
4)LinkedList<T>
  • 存储结构:由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(双向链表还包含指向前一个节点的引用)。
  • 作用:在不需要快速随机访问元素的情况下,提供高效的插入和删除操作。
  • 优点
    • 插入和删除操作高效,特别是在列表的开始或结束位置。
    • 不需要像数组那样在添加或删除元素时移动其他元素。
  • 缺点
    • 索引访问元素的速度相对较慢,需要从头或尾开始遍历。
    • 占用内存比数组多,因为每个节点都需要额外的存储来保存指向其他节点的引用
LinkedList<string> linkedList = new LinkedList<string>();
linkedList.AddFirst("陈晨");
linkedList.AddFirst("陈希");
linkedList.AddFirst("陈冲");

linkedList.AddLast("陈川");

linkedList.Remove("陈晨");
linkedList.Remove("陈晨");

var node  = linkedList.Find("陈冲");
Console.WriteLine("当前节点的值:{0}",node.Value);
foreach (string linked in linkedList)
{
    Console.WriteLine(linked);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式单片机】之RS-232、RS-485、RS-422比较

1. RS422是什么 RS422,正式名称为TIA/EIA-422,是一种串行通信标准,专为实现长距离、高可靠性的数据传输而设计。它采用差分信号传输技术,通过两对双绞线实现全双工通信,即发送和接收可以同时进行。RS422在工业自动化和远程监控系统中曾经扮演着重要角色,以其出色的抗干扰…

p标签文本段落中因编辑器换行引起的空格问题完美解决方案

目录 1.修改前的代码&#xff1a;2.修改后的代码3.总结 在HTML文档中&#xff0c;如何要在&#xff08;p标签&#xff09;内写一段很长的文本段落&#xff0c;并且没有 换行。由于IDE或者编辑器界面大小有限或需要在vue中逻辑处理动态显示文本&#xff0c;一行写完太长&#x…

14-46 剑和诗人20 – 减少幻觉的提示词工程

​​​​​ 概述 幻觉或“编造”是大型语言模型 (LLM) 的常见故障模式&#xff0c;它们会产生事实上不正确或无意义的内容。幻觉背后的一些主要原因是&#xff1a; 当模型不确定真正的答案时&#xff0c;它会试图通过捏造信息来提供过度的帮助。该模型缺乏适当的基础、背景和…

YOLOv5、v7、v8如何修改检测框文字颜色和大小

YOLOv5和YOLOv8默认的标签文字颜色为白色&#xff0c;但是在亮度较大的图片中文字不明显&#xff0c;就需要对标签文字的颜色进行修改 一、YOLOv5 打开X:\Anaconda\envs\your-env\Lib\site-packages\ultralytics\utils\plotting.py X代表你的anaconda安装的盘&#xff0c;yo…

格蠹汇编阅读理解

一、调试工具使用方式 WinDbg常用命令&#xff1a; 执行 lm 命令&#xff0c;可以看到进程中有几个模块。执行~命令列一下线程。用!heap 命令列一下堆。执行!address 命令可以列出用户态空间中的所有区域。搜索吧&#xff01;就从当前进程用户态空间的较低地址开始搜&#xf…

基于大数据技术Hadoop的气象分析可视化大屏设计和实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

Android - 手势

Android 提供特殊类型的触摸屏事件&#xff0c;例如捏合、双击、滚动、长按和退缩。 这些都被称为手势。 Android 提供了 GestureDetector 类来接收运动事件并告诉我们这些事件是否对应手势。 要使用它&#xff0c;您需要创建一个 GestureDetector 对象&#xff0c;然后使用 Ge…

SpringBoot源码阅读(1)——环境搭建

SpringBoot官网 官网 https://spring.io/projects/spring-boot 代码仓库 github&#xff1a;https://github.com/spring-projects/spring-boot gitee: https://gitee.com/mirrors/spring-boot 下载代码 git clone https://gitee.com/mirrors/spring-boot.git下载的代码中有些…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说&#xff0c;IP地址就像是一个独特的身份证&#xff0c;它标识着设备在网络中的位置。对于电脑用户而言&#xff0c;了解如何查看自己电脑的IP地址&#xff0c;不仅有助于我们更…

满足信创环境运行的国产FTP服务器是什么样的?

2018 年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期&#xff0c;中国明确 “数字中国”建设战略&#xff0c; 抢占数字经济产业链制高点。 在…

【Python】已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;&#xff08;paddleocr导包报错&#xff09;ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 近日&#xff0c;一些使用PaddleOCR库进行文字…

西安电子科技大学833、834学长经验分享(初复试总成绩第一、机试第二)

考研经验分享 首先自我介绍。2024考研上岸西安电子科技大学计算机学硕&#xff0c;初试成绩 390 分&#xff0c;复试成绩第一&#xff0c;初复试总成绩第一&#xff0c;机试第二&#xff0c;跟着研梦全程班上岸。 成绩单&#xff1a; 本文主要分为以下几个部分&#xff1a;【…

可视化作品集(09):可视化运维大屏不可或缺。

可视化大屏在可视化运维上有很多价值&#xff0c;而且应用十分普遍&#xff0c;本文给老铁们分享一下。 1. 实时监控&#xff1a;可视化大屏可以实时展示系统运行状态、设备状态、生产数据等信息&#xff0c;使运维人员能够及时发现问题并做出相应的处理。 2. 数据分析&#x…

资源分享—2021版三调符号库

汇总整理平台软件支持过程中客户项目提供的各类资源&#xff08;包括但不限于符号库、地图模板等&#xff09;&#xff0c;在客户允许情况下进行集团内分享。 本次分享新版国土空间规划【三调符号库&#xff08;2021版&#xff09;】&#xff0c;提供SuperMap格式符号库下载。 …

2 ECMAScript

JavaScript 概述 JavaScript 编程语言允许你在 Web 页面上实现复杂的功能;如果你看到一个网页不仅仅显示静态的信息,而是显示依时间更新的内容,或者交互式地图,或者 2D/3D 动画图像,或者滚动的视频播放器,等等——你基本可以确定,这需要 JavaScript 的参与 JavaScript 编程语言…

GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发 多语言平台 Java并不是唯一运行在JVM上的语言,这个我们都应…

仿qq音乐播放微信小程序模板源码

手机qq音乐应用小程序&#xff0c;在线音乐播放器微信小程序网页模板。包含&#xff1a;音乐歌曲主页、推荐、排行榜、搜索、音乐播放器、歌单详情等。 仿qq音乐播放微信小程序模板源码

【前端界面分享】

实现效果&#xff1a;html源码来自b站up主&#xff1a;【CSSJS】甲方&#xff1a;啊&#xff1f;没叫你做那么超前啊_哔哩哔哩_bilibili 本人仅实现了将html格式改为vue3 html版&#xff1a; 对于前端连入门可能都没摸到&#xff0c;学了半天也就改成vue3了&#xff0c;对于输…

PCB阻抗控制为何如此重要?

或许你在各个厂商打PCB板的时候&#xff0c;会遇到询问你是否需要阻抗的的下单需求&#xff1f; 在当今的应用中&#xff0c;设计通常变得越来越快&#xff0c;控制布局参数比以往任何时候都更加重要。 在PCB设计和生产过程中&#xff0c;有几种方法可以进行阻抗控制。最常见的…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统&#xff0c;万界星空科技开源的MES系统。该系统基于Java开发&#xff0c;具有广泛的适用性和高度的可定制性&#xff0c;能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…