02-C#入门(枚举、结构等)
不要为了写笔记而学习!!!
其实学完一章再返回复习,然后做笔记,真的很费时间(电子书还不方便)。当然,复习带来的价值,是值得花时间的。
- 枚举、结构
枚举的类型有限(short、byte...)且是相同的,在MSDN上找到枚举的一些示例,觉得这个还不错:
1 2 3 | enum myWeekDay { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; int i = 3; myWeekDay today = (myWeekDay)i; |
枚举是需要先声明的,然后再通过新建一个变量(today)为枚举类型来使用。枚举默认的基本类型值从0开始,递增1,这叫等差数列。
枚举声明时,建议放在命名空间,当然,也可以放在类或结构中。将其它变量赋值给枚举类型时,需要强制转换,例如:today = (myWeekDay)myByte。当然,还有Enum.Parse(typeof(),)命令,就不具体研究了,用时再来看。
而结构(struct)就比较好用了,一个结构内支持不同基础数据类型。同样需要先声明结构,然后再声明变量为该结构类型,从而使用:
1 2 3 4 5 6 | enum orientation : byte { north = 1, south = 2, east = 3, west = 4}; struct route { public orientation direction; public double distance; } |
使用public:让调用该结构的代码可以访问该结构的成员。具体应用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | route myRoute; int myDirection = -1; double myDistance; Console.WriteLine( "1) North\n2) South\n3) East\n4) West" ); do { Console.WriteLine( "请选择一个行驶方向:" ); myDirection = Convert.ToInt32(Console.ReadLine()); } while (myDirection < 1 || myDirection > 4); Console.WriteLine( "请输入一个距离:" ); myDistance = Convert.ToDouble(Console.ReadLine()); myRoute.direction = (orientation)myDirection; myRoute.distance = myDistance; Console.WriteLine( "指定方向 {0} 的距离是 {1}" , myRoute.direction, myRoute.distance); |
注意myRoute.direction = (orientation)myDirection这一行代码,应该是枚举的应用场景:只需要指明枚举值中的基本类型值i,再通过(enumName)i的方式,即可取得对应的字符串。
声明一个结构:route(创建的结构名) myRoute,再通过 myRoute.属性 的方式访问结构中的成员。
- 数组
印象中的数组总是比较复杂的东东。一个不错的例子:需要存储10个同学的姓名,使用数组即可简单解决,首先声明数组:
1 2 | string [] friendNames = new string [arrayCount]; string [] friendNames = { "张三" , "李四" , "王五" , "谢六" , "陈七" }; |
第一行只初始化数组大小,可选 常数 或 常量,初始化后,才可使用friendNames[0]的方式为数组元素赋值。第二行直接声明数组,并且初始化了数组的内容。
可使用for循环,配合friendNames.Length的大小,来访问数组值,注意第1个元素的位置是0。也可使用foreach,并且不担心超出数组范围。foreach与for的区别在于,foreach是只读访问。
1 2 3 4 | foreach ( string myStr in friendNames) { Console.WriteLine(myStr); } |
多维数组分为矩形数组(多行的每行元素个数相同)、锯齿数组(多行的每行元素个数不同,并可能存在 {列1{行1{层1,层2},行2},列2...}),当然,同样可以使用foreach的方式,取出所有元素的内容,多嵌套一个foreach即可:
1 2 3 4 5 6 7 8 9 | int [][] jaggedIntArray = { new int [] { 1, 2, 3 }, new int [] { 4, 5 }, new int [] { 6, 7, 8, 9 }, new int [] {10, 11} }; foreach ( int [] topArray in jaggedIntArray) { foreach ( int bottomArray in topArray) { Console.Write( "{0} " , bottomArray); } Console.Write( "\n" ); } |
注意:这儿用的都是[]或{},没有用()的方式哈,不要总写错括号,很低级。
- 字符串处理
这个就有意思多了。可以通过myString[1]的方式访问字符串中的每个字符,第1个字符位是0:
1 2 | String myString = " HeLlO WoRlD " ; char myChar = myString[1]; |
使用ToCharArray(),获取一个分解myString每个字符后的char数组:
1 | char [] myChars = myString.ToCharArray(); |
还可以使用myString.Length获取字符串的数量,使用myString.ToLower()转为大写,myString.ToUpper()转为小写。注意:ToLower()、ToUpper()并不会改变变量本身的值的大小写,还需要用myString = myString.ToLower()才能修改变量本身的值。
myString.Trim()可以去掉字符串前、后的空格,还有TrimStart()和TrimEnd(),分别去掉前面和后面的空格。还可以使用Trim(myChar[])的方式,指定去除前后的内容不限于空格(char[] myChar = {' ','s'}):
1 2 3 4 5 6 7 | myString = " sfrost/110110200010101100-13090909880 " ; char mykg = ' ' ; char [] myxhx = { '-' , '/' }; String[] myStrings = myString.Trim(mykg).Split(myxhx); Console.WriteLine( "myStrings[0] = {0}" , myStrings[0]); Console.WriteLine( "myStrings[1] = {0}" , myStrings[1]); Console.WriteLine( "myStrings[2] = {0}" , myStrings[2]); |
最近刚好在搞微信开发,在C#中,上面这个例子,就可以实现以一个(些)关键字分解用户输入的个人信息。例子中使用的Split()方法,同样的可以使用char数组来指明分解的标识。强调一下,Split分解字符串的位置可以是多个不同标记的位置。
- 结语
从这章开始,很多内容都可以马上做一些小的课题了,呵呵。不管是枚举(同类型)、结构(成员不同类型)、数组(一维、矩形[二维]、锯齿[不规则多维])、以及字符串处理,还有枚举与普通变量之间的值如何转换,数组如何声明、初始化和访问等等。而字符串的处理就太有意思了,特别是split,还有replace,再应用char数组,可以说是锦上添花啊。
- 附:习题案例
编写一个控制台应用程序,接收用户输入的字符串,将字符串的顺序以输入时相反的方向输出:
1 2 3 4 5 6 7 8 9 | Console.WriteLine( "请输入需要交换位置的字符串:" ); String myString = Console.ReadLine().Trim(); Console.WriteLine( "{0}" , myString.Length); String tmpStr = "" ; for ( int i = myString.Length; i > 0; i--) { tmpStr += myString[i-1]; } Console.WriteLine(tmpStr); |
编写一个控制台应用程序,接收用户输入的字符串,用yes替换字符串中的所有no:
1 2 3 | Console.WriteLine( "请输入带有no的字符串:" ); myString = Console.ReadLine().ToLower().Trim(); Console.WriteLine( "用 yes 替换掉 {0} 中的 no 后:{1}" , myString, myString.Replace( "no" , "yes" )); |
编写一个控制台应用程序,给字符串的每个单词加上引号(我以为,单词间肯定有空格):
1 2 3 4 5 6 7 8 9 | Console.WriteLine( "请输入带有空格的单词:" ); String myWord = Console.ReadLine().Trim(); String[] myWords = myWord.Split( ' ' ); myWord = "" ; foreach (String tmpWord in myWords) { myWord += "\"" + tmpWord + "\" " ; } Console.WriteLine( "添加引号后的句子:{0}" , myWord); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库