C#编程(四十四)----------string和stringbuilder
System.String类
首先string类是静态的,System.String是最常用的字符串操作类,可以帮助开发者完成绝大部分的字符串操作功能,使用方便.
1.比较字符串
比较字符串是指按照字典排序规则,判定两个字符的相对大小.按照点点规则,在一本英文字典中,出现在前面的单词小于出现在后面的单词.在string类中,常用的比较字符串的方法包括Compare,CompareTo,CompareOrdinal以及Equals,下面进行详细的介绍.
Compare()方法是string类的静态方法,用于全面比较两个两个字符串对象,包括6种重载方法.CompareTo()方法将当前字符串对象与另一个 对象做比较,其作用与Compare类似,返回值也相同.CompareTo与Compare相比,区别在于:CompareTO不是静态方法,可以通过一个string对象调用;CompareTo没有重载形式,只能按照大小写敏感方法比较两个整串.
Equals()方法用于方便的判断两个字符串是否相同,有两种重载形式:
public bool Equals(string str)
public static bool Equals(string str1,string str2);
如果两个字符串相等,Equals()返回值为true;否则,返回False.
string支持两个比较运算符”==”和”!=”,分别用于判定两个字符串是否相等和不等,并区分大小写.相对于上面介绍的方法,这两个运算符使用起来更加直观和方便.
2.定位字符串和子串
定位子串是指在一个字符串寻找其中包含的子串或者某个字符,在string类中,常用的定位子串和字符的方法包括:StartsWith(),EndsWith(),IndexOf(),LastIndxOf(),IndexOfAny()以及LastIndexOf(),下面进行详细介绍:
StartsWith()/EndsWith()方法
可以判定一个字符串对象是否以另一个子做富川开头,如果是返回True;否则返回false,其定义为:public bool StartsWith(string value) //参数value即待判定的子字符串.
IndexOf()/LastIndexOf()
IndexOf()方法用于搜索一个字符串,某个特定的字符串或子串第一次出现的位置,该方法区分大小写,并从字符串的首字符以0技术.如果字符串中不包含这个字符或子字符串,则返回-1.共有如下6中重载形式:
定位子串:
int IndexOf(char value)
int IndexOf(char value , int StartIndex)
int IndexOf(char value,int startIndex int count)
定位子串:
int IndexOf(stringvalue)
int IndexOf(string value , int StartIndex)
int IndexOf(stringvalue,int startIndex int count)
在上述的重载行驶中,其参数含义如下
value:待定位的字符或者子串
startIndex:在总串中开始搜索的起始位置
Count:在总串中从起始位置 开始搜索的字符数.
IndexOfAny()/LastIndexOfAny()
其功能同IndexOf类似,其区别在于,可以搜索在一个字符串中,出现在一个字符串数组中的任意字符第一次出现的位置.同样,该方法区分大小写,并从字符串的首字符开始以0技术.如果字符串中不包括这个字符或子串,则返回-1.
同IndexOfAny类似,LastIndexOfAny用于搜索在一个字符串中,出现在一个字符数组中任意字符最后一次出现的位置。
案例:
string s = "hello";
char[] arr = { 'H','e','l'};
int i1 = s.IndexOfAny(arr);
int i2 = s.LastIndexOfAny(arr);
Console.WriteLine("IndexOfAny的结果是 :{0} \nLastIndexOfAny的结果是 :{1}",i1,i2);
Console.ReadKey();
.IndexOfAny有三种重载形式:
int IndexOfAny(char [] anyOf)
int IndexOfAny(char [] anyOf,int startIndex)
int IndexOfAny(char [] anyOf,int startIndex,int count)
在上述重载行驶中,其参数含义如下:
anyOf:待定位的字符或者子串,方法将返回这个数组中任意一个字符第一次出现的位置
startIndex:在总串中开始搜索得起始位置
Count:在总串中从起始位置开始搜索的字符串
3.格式化字符串
Format()方法用于创建格式化的字符串以及连接多个字符串对象.FOrmat()方也有多个重载形式,最常用的是:
public static string Format(string format,params object [] args);
其中,参数format用于指定返回字符串的格式,而args为一系列变量参数.可以通过下面的实例来掌握其用法.
string strA = "hello", strB = "world",newStr="";
newStr = string.Format("{0},{1}",strA,strB);
Console.WriteLine(newStr);
在format参数中包含一些用大括号括起来的数字,如{0},{1},这些数字分别一一对应于args参数数组中的变量.在生成结构字符串时,将使用这些变量代替{i}.需要说明的是,这些变量并不是非得为string类型.在特定的应用中,format方法非常方便.例如,要输出一定个事的瞬间字符串,便可以使用format()方法,代码如下:
newStr = string.Format("CurrentTIme={0:yyyy:MM:dd}",System.DateTime.Now);
Console.WriteLine(newStr);
其中,格式字符串”yyyy:MM:dd”指定返回时间的格式形如”2015:7:21”.
4.连接字符串
Concat()方法用户谅解两个或多个字符串,Concat()方法也有多个重载形式,最常用的为:public static Concat(params string [] values);//其中values用于指定索要连接的多个字符串,可以死通过下面的实例来掌握其使用方法.
string newStr = string.Concat("hello"," ","world");
Console.WriteLine(newStr);
Join()方法利用一个字符数组和一个分割字符串构造新的字符串.常用于把多个字符串连接在一起,并用一个特殊的符号来分隔开.Join()方法的常用形式:public static string Join(string separator ,string [] values);//其中,参数separator 为指定的分隔符,而values用于指定所要连接的多个字符串数组,案例:
string strA = "hello", strB = "world",newStr="";
//newStr = string.Format("CurrentTIme={0:yyyy:MM:dd}",System.DateTime.Now);
//string newStr = string.Concat("hello"," ","world");
string []strArr={strA,strB};
//使用^^分隔字符串数组
newStr = string.Join("^^",strArr);
Console.WriteLine(newStr);
Console.ReadKey();
连接运算符”+”
string支持连接运算符”+”,可以方便的连接多个字符串,例如,下面把”hello”和”world”连接起来;
string newStr = "hello" + ",world";
Console.WriteLine(newStr);
5.分割字符串
使用前面介绍的Join方法,可以利用一个分隔符把多个字符串连接起来.反过来,使用Split方法可以把一个整串,按照某个分隔符,分裂成一系列小的字符串.例如,把整串”hello^^world”按照字符”^”进行分割,可以得到三个小的字符串,即”hello”,””(空串),”world”.
Split()方法有多个重载形式,最常用的形式为:
public string [] Split(params char [] separator)
其中参数separator数组包含分隔符.下例把”hello^^world”进行分割:
string newStr = "hello^^world";
char[] separator = { '^'};
string[] splitStrings = new string[100];
splitStrings = newStr.Split(separator);
int i = 0;
while (i<splitStrings.Length)
{
Console.WriteLine("item:{0} {1}",i,splitStrings[i]);
i++;
}
6.插入和填充字符串
string类包含了在一个字符串中插入新元素的方法,可以用insert()方法在任意位置插入任意字符.Insert()方法用于在一个字符串的指定位置插入另一个字符串,从而构造一个新的串,Insert()方法也有多个虫子形式,最常用的是:
public string Insert(int startIndex, string value);
其中,参数startIndex用于指定所要插入的位置,从0开始索引;value指定所要插入的字符串.
下例在”hello”的字符”h”后面插入”world”,最后的结果为”hworldello”:
string newStr = "";
newStr = "hello".Insert(1, "world");
Console.WriteLine(newStr);
7.删除和剪切字符串
Remove()方法从一个字符串的指定位置开始,删除指定数量的字符.最常用的形式为:
public string Remove(int startIndex,int count);
其中,参数startIndex用于指定开始删除的位置,从0开始索引;count指定删除的字符数量.下例中,将”hello”中的”ell”删除:
string newStr = "hello";
newStr = newStr.Remove(1, 3);
Console.WriteLine(newStr);
Trim()方法
若想把一个字符串首尾处的一些特殊字符删除,如去掉一个字符串首尾的空格等,可以使用string的Trim()方法.形式:
public string Trim();
public string Trim(params char [] trimChars);
其中,参数trimChars数组包含了指定要去除的字符,如果缺省,则删除空格符号.下例中,实现了对”@hello#$”的净化.
char[] trimChars = { '@','#','$'};
string str = "@hello#$";
string newStr = str.Trim(trimChars);
Console.WriteLine(newStr);
8.复制字符串
string类包含了复制字符串方法Copy和CopyTo,可以完成对一个字符串及其一部分的复制操作.
Copy()方法可以把一个字符串复制到另一个字符数组中,形式为:public string Copy(string str);其中,参数str为需要复制的源字符串,方法返回目标字符串.
CopyTo()方法可以实现Copy同样的功能,但功能更为丰富,可以赋值字符串的一部分到一个字符数组中.另外CopyTo不是静态方法,其形式为:
public void CopyTo(int sourceIndex,char [] destination,int destinationIndex,int count);
其中,参数sourceIndex为需要复制的字符起始位置,destination为目标字符数组,destinationIndex指定目标数组中的开始存放位置,而count指定要复制的字符个数.
案例:
char[] newCharArr = new char[100];
"hello".CopyTo(2, newCharArr, 0, 3);
Console.WriteLine(newCharArr);
分析:把”hello”中的llo复制到newCharArr中.
9.替换字符串
要替换一个字符串中的某些特定字符或者某个子串,可以使用Replcace()方法来实现,其形式为:
public string Replace(char oldChar,char newStr);
public string Replac(string oldValue,string newValue);
其中,参数oldChar和oldValue为待替换的字符和子串,而newChar和newValue为替换后的新字符和新子串:
string newStr = "hello".Replace("ll", "r");
Console.WriteLine(newStr);
10.更改大小写:
string提供了方便转换字符串中所有字符大小写的方法ToUpper和TOLower.这两个方法没有输入参数,使用也非常方便.案例:
Console.WriteLine("hello".ToUpper());
Console.WriteLine("HELLO".ToLower());
总结:本节介绍了最常用的String类,并从比较、定位子串、格式化、连接、分裂、插入、删除、复制、大小写转换10个方面介绍了其方法。之所以称String对象为静态串,是因为一旦定义一个String对象,就是不可改变的。在使用其方法(如插入、删除操作)时,都要在内在中创建一个新的String对象,而不是在原对象的基础上进行修改,这就需要开辟新的内存空间。如果需要经常进行串修改操作,使用String类无疑是非常耗费资源的,这时需要使用StringBuilder类。
创建新的string对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用System.StringBuikder类.例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能.
通过用一个重载的构造函数方法初始化变量,可以创建StringBuilder类的新实例,示例如下:
StringBuilder sb=new StringBuilder(“hello,world”);
设置容量和长度
虽然StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是你可以为它容纳的最大字符数指定一个值,此值称为该对象的容量,不应将它与当前StringBuilder 对象容纳的字符串长度混淆在一起.例如,可以创建StringBuilder类的带字符串”hello”(长度为5)的一个新实例,同时可以指定该对象的最大容量为25.当修改StringBuilder时,在达到容量之前,他不会为其自己重新分配空间.当达到容量时,将自动分配新的空间且容量翻倍.可以使用重载的构造函数之一来指定StringBuilder类的容量,下例指定可以将StringBuilder对象扩充到最大25个空白.
StringBuilder sb=new StringBuilder(“hello,world”,25);
另外,可以使用读/写Capacity属性来设置对象的最大长度.下例代码使用Capacity属性来定义对象的最大长度.
sb.Capacity=25;
EnsureCapacity方法可用来检查当前StringBuilder的容量
也可以查看或设置Length属性.如果将Length属性设置为大于Capacity属性的值,则自动将Capacity属性更改为与Length属性相同的值.如果将Length属性设置为小于当前StringBuilder 对象内的字符串长度的值,则会缩短该字符串.
修改 StringBuilder 字符串
方法名 使用
StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。
StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。
StringBuilder.Replace 替换指定索引处的指定字符。
Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。以下示例将一个 StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Append(" What a beautiful day."); Console.WriteLine(MyStringBuilder);
此示例将 Hello World! What a beautiful day. 显示到控制台。
AppendFormat
AppendFormat 方法将文本添加到 StringBuilder 的结尾处,而且实现了 IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder 的后面。以下示例使用 AppendFormat 方法将一个设置为货币值格式的整数值放置到 StringBuilder 的结尾。
int MyInt = 25; StringBuilder MyStringBuilder = new StringBuilder("Your total is "); MyStringBuilder.AppendFormat("{0:C} ", MyInt); Console.WriteLine(MyStringBuilder);
此示例将 Your total is $25.00 显示到控制台。
Insert
Insert 方法将字符串或对象添加到当前 StringBuilder 中的指定位置。以下示例使用此方法将一个单词插入到 StringBuilder 的第六个位置。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Insert(6,"Beautiful "); Console.WriteLine(MyStringBuilder);
此示例将 Hello Beautiful World! 显示到控制台。
Remove
可以使用 Remove 方法从当前 StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。以下示例使用 Remove 方法缩短 StringBuilder。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Remove(5,7); Console.WriteLine(MyStringBuilder);
此示例将 Hello 显示到控制台。
Replace
使用 Replace 方法,可以用另一个指定的字符来替换 StringBuilder 对象内的字符。以下示例使用 Replace 方法来搜索 StringBuilder 对象,查找所有的感叹号字符 (!),并用问号字符 (?) 来替换它们。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Replace(’!’, ’?’); Console.WriteLine(MyStringBuilder);
C#编程(四十四)----------string和stringbuilder的更多相关文章
- 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作
孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...
- NeHe OpenGL教程 第四十四课:3D光晕
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 网站开发进阶(四十四)input type="submit" 和"button"的区别
网站开发进阶(四十四)input type="submit" 和"button"的区别 在一个页面上画一个按钮,有四种办法: 这就是一个按钮.如果你不写ja ...
- Gradle 1.12用户指南翻译——第四十四章. 分发插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关
0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...
- “全栈2019”Java第四十四章:继承
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Android项目实战(四十四):Zxing二维码切换横屏扫描
原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...
- 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法
第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- Spark(四十四):使用Java调用spark-submit.sh(支持 --deploy-mode client和cluster两种方式)并获取applicationId
之前也介绍过使用yarn api来submit spark任务,通过提交接口返回applicationId的用法,具体参考<Spark2.3(四十):如何使用java通过yarn api调度sp ...
随机推荐
- poj1521
霍夫曼编码,建树 #include <cstdio> #include <cstring> #include <queue> using namespace std ...
- Mac 命令行安装 dmg文件
1.安装dmg文件 hdiutil attach jdk-9.0.1_osx-x64_bin.dmg 会挂载在 /Volumes 目录下 2.安装pkg文件(可以 man installer 查看命令 ...
- laravel5.3之后可以使用withCount()这个方法
比如:文章控制器ArticleController.php查询文章列表数据的时候用withCount连接Comment,Zan模型直接统计每篇文章的评论和点赞数量. 使用之前需要在文章模型文件Arti ...
- Windows xp下安装sql server2005所碰到的一些问题及解决方法
之前提到的帮老板做的一个中船重工的项目,其中的一个子模块:windows下获取特定进程网络流量 一开始是用VS2010做的,后来老板把项目书拿给我看后,明确要求开发环境为VS2005和Sql serv ...
- 执行了‘“npm install mysql"
http是核心模块,封装到安装包里面了,如果在你项目的当前目录下<code>npm install mysql<code>的话就会在你当前目录下的node_modules文件夹 ...
- VMware下三种网络连接模式
VMware下三种网络连接模式 Bridged(桥接模式) 在桥接模式下,VMware虚拟出来的操作系统就像是局域网中的一独立的主机,它可以访问该类网段内任何一台机器. 桥接网络环境下需要做到: 手动 ...
- [图解算法] 二分查找Binary-Search——<递归与分治策略>
#include"iostream.h" int BinarySearch(int a[],int left,int right,const int& x) { if(le ...
- Linux系统运维笔记(二),Linux文件编辑命令
Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...
- 【AtCoder】ARC085
C - HSI 题解 \(E = 1900 * (N - M) + 100 * M + \frac{1}{2^{M}} E\) \(E = 2^{M}(1900 * (N - M) + 100 * M ...
- 7-9The Morning after Halloween uva1601
这题可以用普通bfs来做 也可以用双向bfs来做(先欠着) 有点类似专题训练的一题 不过那题是找钥匙开门 不过都用了状态压缩 题意: n,m(<=16) 的网络上有t(<=3) ...