云计算百科
云计算领域专业知识百科平台

第一阶段c#基础-8:StringBuilder,数组

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数组中,是因为发生了协变

赞(0)
未经允许不得转载:网硕互联帮助中心 » 第一阶段c#基础-8:StringBuilder,数组
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!