c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)
枚举、结构
枚举的类型有限(short、byte...)且是相同的,在msdn上找到枚举的一些示例,觉得这个还不错:
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)就比较好用了,一个结构内支持不同基础数据类型。同样需要先声明结构,然后再声明变量为该结构类型,从而使用:
enum orientation : byte { north = 1, south = 2, east = 3, west = 4};
struct route
{
public orientation direction;
public double distance;
}
使用public:让调用该结构的代码可以访问该结构的成员。具体应用:
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个同学的姓名,使用数组即可简单解决,首先声明数组:
string[] friendnames = new string [arraycount];
string[] friendnames = {"张三","李四","王五","谢六","陈七"};
第一行只初始化数组大小,可选 常数 或 常量,初始化后,才可使用friendnames[0]的方式为数组元素赋值。第二行直接声明数组,并且初始化了数组的内容。
可使用for循环,配合friendnames.length的大小,来访问数组值,注意第1个元素的位置是0。也可使用foreach,并且不担心超出数组范围。foreach与for的区别在于,foreach是只读访问。
foreach (string mystr in friendnames)
{
console.writeline(mystr);
}
多维数组分为矩形数组(多行的每行元素个数相同)、锯齿数组(多行的每行元素个数不同,并可能存在 {列1{行1{层1,层2},行2},列2...}),当然,同样可以使用foreach的方式,取出所有元素的内容,多嵌套一个foreach即可:
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:
string mystring = " hello world ";
char mychar = mystring[1];
使用tochararray(),获取一个分解mystring每个字符后的char数组:
char[] mychars = mystring.tochararray();
还可以使用mystring.length获取字符串的数量,使用mystring.tolower()转为大写,mystring.toupper()转为小写。注意:tolower()、toupper()并不会改变变量本身的值的大小写,还需要用mystring = mystring.tolower()才能修改变量本身的值。
mystring.trim()可以去掉字符串前、后的空格,还有trimstart()和trimend(),分别去掉前面和后面的空格。还可以使用trim(mychar[])的方式,指定去除前后的内容不限于空格(char[] mychar = {' ','s'}):
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数组,可以说是锦上添花啊。
附:习题案例
编写一个控制台应用程序,接收用户输入的字符串,将字符串的顺序以输入时相反的方向输出:
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:
console.writeline("请输入带有no的字符串:");
mystring = console.readline().tolower().trim();
console.writeline("用 yes 替换掉 {0} 中的 no 后:{1}", mystring, mystring.replace("no", "yes"));
编写一个控制台应用程序,给字符串的每个单词加上引号(我以为,单词间肯定有空格):
console.writeline("请输入带有空格的单词:");
string myword = console.readline().trim();
string[] mywords = myword.split(' ');
myword = "";
foreach(string tmpword in mywords)
{
myword += "\"" + tmpword + "\" ";
}
console.writeline("添加引号后的句子:{0}", myword);