1 string补充
(1)判断字母是大写还是小写
string str = "AsdX";
string ss1 = str[i].ToString();
//第一种
ss1==ss1.ToUpper()
//第二种
char.IsUpper(str[i])
//第三种
str[i] > 'a' && str[i] < 'z'
(2)str.PandLeft():补齐字符,右对齐;
string oldValue = "吴亦凡";
string newValue = "*".PadLeft(oldValue.Length, '*');//**
2 stringBuilder类
2.1 字符串的拼接
(1)字符串的拼接方式:+ ;($"");(”{0}“,name);string.Format()
string name = "张三";
int age = 19;
Console.WriteLine("名字是"+name+"今年"+age+"岁");
Console.WriteLine($"名字是{name}今年{age}岁");
Console.WriteLine("名字是{0}今年{1}岁",name,age);
Console.WriteLine(string.Format("名字是{0}今年{1}岁", name, age));
string.Format():在编号后面添加一个数字,表示此处至少 占用多少个字符的位置;
在编号后面加:Cn表示货币的格式显示,并保留n位小数
Console.WriteLine(string.Format("名字是{0,10}今年{1}岁", name, age));
//名字是 张三今年19岁
Console.WriteLine(string.Format("银行卡余额{0:C3}", 32423.1234567));
//银行卡余额¥32,423.123
string.Format()也可以格式化显示时间
Console.WriteLine(string.Format("我是{0},现在的时间是{1}", name, DateTime.Now));//我是张三,现在的时间是2025/7/10 17:09:45
Console.WriteLine(string.Format("我是{0},现在的时间是{1:yyyy年,MM月,dd日}", name, DateTime.Now));//我是张三,现在的时间是2025年,07月,10日
2.2 字符串的修改
(1)String类型在C#中用于保存字符,为引用类型,一旦创建,就不能再进行修改,其底层是根据字符数组(char[])实现的
(2)C#中的字符串是不可变的,每一次修改,本质上产生了新的字符串;尽管从语法上看,似乎可以更改内容,底层原理是重新开辟了一块新的内存,每一次修改,就会把旧值“扔掉”,让变量指向堆内存中新的内存,旧值就会处于游离状态,等待垃圾回收机制(GC)回收
(3)StringBuilder表示可变字符字符串类型,其中的字符可以被改变、增加、删除,当向一个已满的StringBuilder添加字符时,其会自动申请内存进行扩容
(4)当需要频繁修改字符串时,使用StringBuilder更好
2.3 StringBuilder的方法
(1)sb.Append():增加;sb.AppendLine():增加一行内容
StringBuilder sb1= new StringBuilder();
sb.AppendLine("吴亦凡");
sb.AppendLine("罗志祥");
sb.Append("李四");//不换行
sb.Append("张三\\r\\n");//换行
sb.Append("王五"+Environment.NewLine);//换行
sb.Append("赵李");
Console.WriteLine(sb);
/*
吴亦凡
罗志祥
李四张三
王五
赵李*/
(2)格式化输出:sb.AppednFormat();
sb.AppendFormat("{0,10}{1}{2}", 111, 222, 333);
Console.WriteLine(sb);
Console.WriteLine(sb.Length);//38
(3)sb.Insert():正索引为n的位置插入字符串;
sb.Remove();删除
sb.Replace();替换
sb.Insert(0, "abc");c#
Console.WriteLine(sb);
sb.Remove(2, 3);
sb.Replace("a", "*");
(4)sb.Capacity;容量;设置容量,当存储的字符超过设定的容量,StringBuilder自动扩容,一般都是成倍扩容,一般不设置
Console.WriteLine(sb.Capacity);//64
StringBuilder sb2 =new StringBuilder();
Console.WriteLine(sb2.Length);//0
Console.WriteLine(sb3.Length);//0
3 数组
3.1 一维数组
3.1.1 数组的声明和初始化
(1)数组是一个用来存储相同类型数据的、固定大小的、具有连续内存位置的顺序集合。数组中的每个元素都对应一个索引值,索引从 0 开始依次递增,我们可以通过索引来访问数组中的指定元素
(2)数组的数组的声明类似于声明变量,需要指定数组中数据的类型,一般数组变量的名称以复数的形式命名(加s)names numbers
声明格式:数据类型[] 变量名
int[] ints;
(3)数组的初始化:
格式:变量名=new 数据类型[数组的长度];
ints = new int[10];
(4)数组声明和初始化可以简写;可以在初始化的时候指定初始值
如果初始化的时候指定了初始值,可以省略长度,数组会根据初始值的个数自动推导数组的长度
声明初始化的时候可以省略new 数据类型[]
数组在初始化后c#会自动在数组中填充对应类型的默认值进行占位,数值类型的默认值是0,bool类型的默认值是false,char类型的默认值是\\0,引用数据类型的默认值是null
string[] names1 = new string[3] {"张三","李四","王五" };
string[] names2 = new string[] {"张三","李四","王五" };
string[] names3 = { "张三", "李四", "王五" };
3.1.2 数组的操作
(1)数组的操作都是基于索引,索引从0开始,到数组的长度(Length)-1结束,用于访问数组中存储的数据
(2)数组中数据的读取:数组名[索引]
Console.WriteLine(names3[0]);//张三
(3)数组中数据的设置:数组名[索引] = 值
names3[1] = "赵四";
(4)数组的遍历 for();foreach()
foreach的优缺点:优点:简洁;缺点:无法修改数组,无法使用break,countinue终止数组
for(int i = 0; i < names4.Length; i++)
{
Console.WriteLine(names4[i]);
}
//foreach(数组中的数据类型 变量名 in 需要遍历的数组){}
foreach(string item in names4)
{
Console.WriteLine(item);
}
4 多维数组
(1)C#中支持多维数组(矩阵数组)最简单的数组就是一维数组,最简单的多维数组就是二维数组
(2)多维数组的定义:数据类型[N-1个,] 变量名 = new 数据类型[每个维度的长度]
例如 二维数组:数据类型[ , ] 变量名 = new 数据类型[3,2];
三维数组:数据类型[ , ,] 变量名 = new 数据类型[3,2,3];
四维数组:数据类型[ , , ,] 变量名 = new 数据类型[3,2,4,5];
(3)初始化:初始化可以根据初始值自动推导长度,但new后面的[]必须有逗号
int[,] ints2 = new int[,]
{
{1,2,3,4 },
{1,2,3,4 },
{1,2,3,4 },
};
string[,] strings = new string[,]
{
{"a","b","c" },
{"aa","bb","cc" },
{"aaa","bbb","ccc" },
};
(4)取值 数组变量名[行,列]
Console.WriteLine(strings[0,0]);//a
Console.WriteLine(strings[0,1]);//b
Console.WriteLine(strings[1,0]);//aa
Console.WriteLine(strings[2,1]);//bbb
(5)Length属性获取到数组的总长度,即数据的个数
GetLength()获取对应维度的元素个数(长度)
Console.WriteLine(strings2.Length);
Console.WriteLine(strings2.GetLength(0));//第一个维度的长度
Console.WriteLine(strings2.GetLength(1));//第二个维度的长度
5 交错数组
(1)交错数组就是装着数组的数组,交错数组里面存储的也是数组
(2)交错数组和多维数组的区别:交错数组的每一个长度可以不同,多维数组每一维长度必须相同
(3)交错数组的定义:数据类型 [] [] 变量名 几层交错数组就几个[]
int[] ints1;//一层交错数组,就是普通的一维数组
int[][] ints2;//二层交错数组,数组中装着一层交错数组
int[][][] ints3;//三层交错数组,数组中装着二层交错数组
(4)初始化
int[][] intss2 = new int[][]
{
new int[] { 1, 22222222, 3 },
new int[] { 1,2,1, 2, 3 },
new int[] { 1,2,3,3,3,3, 2, 3 },
new int[] { 1, 2, 3, 45, 6, 6, 67, 2, 3 },
};
(5)取值 intss2[0] [1]
foreach (int[] Arr in intss2)
{
foreach (int item in Arr)
{
Console.WriteLine(item);
}
}
for (int i = 0; i < intss2.Length; i++)
{
for (int j = 0; j < intss2[i].Length; j++)
{
Console.WriteLine(intss2[i][j]);
}
}
(6)Length:交错数组中数组的个数
Console.WriteLine(intsss.Length);
Console.WriteLine(intsss[0].Length);
6 数组的属性和方法
(1)所有数组都是Array类的实例,Array提供里一系列的属性和方法
(2)strs.Length:返回一个32位的整数, 表示数组的长度
strs.LongLength:返回一个64位的整数, 表示数组的长度
strs.Rank:返回数组的维度
Console.WriteLine(ints.Length);//返回一个32位的整数, 表示数组的长度
Console.WriteLine(ints.LongLength);//返回一个64位的整数, 表示数组的长度
Console.WriteLine(ints2.Rank);//返回数组的维度
(3)Array.Clear(); 将数组中指定的数据恢复为对应类型的默认值
参数1:需要恢复的数组
参数2:开始的索引
参数3:恢复的个数
int[] ints3 = { 1, 2, 3, 4, 5, 6, 77, 8, 8, 88, 88, 8, 32, 323 };
Array.Clear(ints3,1,4);//{1,0,0,0,0,6,77,8,8,88,88,8,32,323}
(4)Array.Copy(); 将参数1数组中的数据复制到参数2数组中,由参数3决定复制的个数
复制的仅仅是数组中的元素,这是两个不同的数组,不会互相影响
int[] ints4 = new int[10];
Array.Copy(ints3,ints4,5);
WriteArr(ints4);//{1,2,3,4,5,0,0,0,0,0,}
重载:参数1: 被复制的数组 参数2: 复制的开始位置 参数3: 复制到的目标数组 参数4: 目标数组开始的位置 参数5: 复制的个数
int[] ints5 = { 1, 2, 3, 4, 12, 3, 23, 2, 22 };
int[] ints6 = new int[6];
Array.Copy(ints5,2,ints6,1,4);
WriteArr(ints6);//{0,3,4,12,3,0,}
(5)Array.Reverse();反转数组
Array.Reverse(ints5);
WriteArr(ints5);//{22,2,23,3,12,4,3,2,1,}
(6)Array.IndexOf() 从前向后查询参数2在参数1数组中首次出现的位置,并返回索引,没有找到返回-1
Console.WriteLine(Array.IndexOf(ints5,3));//1
参数3:指定开始查询的位置
参数4:指定查询的个数
Console.WriteLine(Array.IndexOf(ints5,3,5));、//
//查询23 从索引为3的位置开始查询 查询3个
Console.WriteLine(Array.IndexOf(ints5,23,3,3));//
7 存储引用类型
(1)数组是引用类型
(2)数组中保存的是内存地址
(3)Student类继承People类,则Student类型的数据可以放到People数组中,是因为发生了协变
评论前必须登录!
注册