C# 基础知识系列- 9 字符串的更多用法(二)
0. 前言
上一篇文章介绍了字符串自身的一些方法,就是对象方法。在字符串体系中,还有一些是string类提供的静态方法。这两部分构成了字符串体系,当然还有一些三方库为字符串提供了扩展方法。
这里简单的介绍一下string类的静态方法。
1. 玩转创建字符串
1.1 Create一个字符串
通过调用string.Create方法可以生成一个字符串。该方法的声明是
public static string Create<TState> (int length, TState state, System.Buffers.SpanAction<char,TState> action);
简单的来讲就是生成一个长度为length的字符串,基本元素是 TState类型的state,具体的填充过程交由action来进行处理。值得注意的是action是一个委托,也就是它可以用lambda表达式直接使用,具体声明如下:
public delegate void SpanAction<T,in TArg>(Span<T> span, TArg arg);
因为方法中指定了Span参数为char,那么 action 的写法应该如下:
(span, state)=>//span 的类型是 Span<char>,state的类型是 TState
{
// 注意,没有返回值
}
示例:
string str = "12320kz,zxcqweqwkuqwiqewpqwwe";
Console.WriteLine(string.Create(10,str, (span, c) =>
{
span.Fill(c[0]);
}));
span的方法Fill的参数是char,所以这个方法就是按照一定逻辑将 state参数转换成char然后填充给字符串,在action中多次调用Fill只会生效最后一次填充。
1.2 连接多个元素
字符串的连接有两个方法,一个是string.Concat,一个是string.Join。
首先介绍Concat,这个方法最基本的功能就是将多个字符串收尾连接成一个字符串,继续引申,连接任意个对象形成一个字符串,最后将一个集合的元素拼接成字符串。所以,这个方法的声明就有以下内容:
public static string Concat (string str0, string str1);
public static string Concat (object arg0, object arg1);
public static string Concat (params string[] values);
public static string Concat (params object[] args);
public static string Concat (System.Collections.Generic.IEnumerable<string> values);
public static string Concat<T> (System.Collections.Generic.IEnumerable<T> values);
以上只是几个具有代表性的方法,介绍到这里有没有觉得它的实现很眼熟?
没错,字符串的‘加法’运算就是基于这个方法实现的。
Join在行为上与Concat很相似,但是这个方法是用一个分割符(可以是字符串)将一组对象连接起来,所以它的声明就是如下内容:
public static string Join (char separator, params object[] values);
public static string Join<T> (char separator, System.Collections.Generic.IEnumerable<T> values);
public static string Join (string separator, params object[] values);
public static string Join<T> (string separator, System.Collections.Generic.IEnumerable<T> values);
这两个方法出镜率非常高,不过Concat更多的是用‘加法’形式,而Join在多个元素快速生成字符串中非常常见。
这里简单介绍一下Join的使用:
var list = new List<int>();
for (var i = 0; i < 10; i++)
{
list.Add(i);// 生成一个列表,元素是0到9这十个数字
}
string str = string.Join(",", list);//0,1,2,3,4,5,6,7,8,9
2. 快来比一比
2.1 我们是不是同一个
因为字符串机制的问题,所以一般字符串的相等性比较分为了两种,字面相等性和引用相等性。在C#中默认的相等性比较是字面值相等性。示例:
string str1 = "123";
string str2 = "123";
string str3 = new string("123");
bool eq1 = str1 == str2;// true
bool eq2 = str2 == str3;// true
bool eq3 = str1 == str3;// true
那么如何判断是否是同一个引用呢?通过object.ReferenceEquals来判断是否是同一个引用。继续上面的例子:
bool req1 = object.ReferenceEquals(str1, str2);// true
bool req1 = object.ReferenceEquals(str2, str3);// false
bool req3 = object.ReferenceEquals(str1, str3);// false
在C#中,编译器会将一样字面值的字符串指向同一个地址,这个地址是在字符串的常量池中。而使用new等方法创建的字符串,是在程序运行后才会确认字符串具体的值,所以这个地址是后分配的。所以上述两种判断方式会出现不同的结果。
string类提供了一个静态方法Equals,方法声明如下:
public static bool Equals (string a, string b);
public static bool Equals (string a, string b, StringComparison comparisonType);
该方法返回两个字符串是否是相等的,也就是与字符串默认的==判断是一致的。
2.2 来比一比高矮
在我们开发的过程中经常会遇到对字符串进行排序的需求,那么字符串排序的逻辑是什么呢?
对于数字、字母来说是按照ASCII码进行排序的,也就是数字、小写、大写字母这样进行排序。当加入中文后,中文排最后,同种字符按字典顺序进行排序。对于一些跨语言的排序会因为语言不同而导致排序结果不一样。这里有兴趣的可以查看一下微软的官方文档。
介绍一下字符串排序的基本方法:Compare
这个方法有一个对象的相似方法是CompareTo,这个方法是IComparable接口定义的方法,与这个方法行为一致。该方法常用的有如下几个定义:
public static int Compare (string strA, string strB);
public static int Compare (string strA, string strB, StringComparison comparisonType);
这个方法返回一个整型,可以理解为两个字符串之间的距离,正的表示A在B的后面,负的表示A在B的前面。值的绝对值越大,两个字符串之间的距离也越大,但是值本身不具备意义。如果值为0,则表示这两个字符串相等。
有一个重载版本里有个参数类型是StringComparison,这是一个枚举类型,用来定义在比较两个字符串时的一些行为,后续有机会详细介绍这一部分。
示例:
string str1 = "123a";
string str2 = "132a";
int position1 = string.Compare(str1, str2);// -1
str1 = "你好";
str2 = "我们";
int position2 = string.Compare(str1, str2);// -1
可以明显看出,排序规则基本就是字典顺序。
3. 补充
补充三个上一篇文章遗漏的方法,插入、删除、获取一个子串。
3.1 插入到某个位置
public string Insert (int startIndex, string value);
在源字符串指定的位置插入一个字符串并返回插入的结果。
3.2 删除
//从startIndex开始,后面的所有元素都删除,包括startIndex,返回剩下的字符
public string Remove (int startIndex);
//从startIndex开始,删除 count个元素,返回剩下的字符
public string Remove (int startIndex, int count);
3.3 获取一个子串
// 返回从startIndex开始,剩下的的元素,包括startIndex
public string Substring (int startIndex);
// 返回从startIndex开始,一共count个元素的字符串,包括startIndex
public string Substring (int startIndex, int length);
这一部分的方法比较简单,就不做示例演示了。不过需要注意的是 所有参数都应该是大于0的,且不能大于字符串的长度,包括 startIndex+count。
4. 总结
目前为止,字符串的常规使用已经完成了,但是字符串的使用却并没有结束,后续会继续介绍C#其他内容,其中有几个内容是与字符串有很大的关联的,这里先容我卖个关子。
更多内容烦请关注我的博客

C# 基础知识系列- 9 字符串的更多用法(二)的更多相关文章
- C# 基础知识系列- 9 字符串的更多用法(一)
0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
- C# 基础知识系列- 2 字符串
String的常见方法 String 变量的声明方式 C#中字符串常见的声明有两种: 直接使用字面值 即String s = "12321"; 使用构造器,即String s = ...
- C# 基础知识系列- 13 常见类库介绍(二)日期时间类
0. 前言 上一篇内容介绍了Console类和Math类,这篇内容着重介绍一下C#中时间日期的处理方式. 上一篇勘误: 上一篇中关于静态类没有构造函数,这一表述有误.正确的说法是C#中静态类不包含常规 ...
- [C# 基础知识系列]专题八: 深入理解泛型(二)
引言: 本专题主要是承接上一个专题要继续介绍泛型的其他内容,这里就不多说了,就直接进入本专题的内容的. 一.类型推断 在我们写泛型代码的时候经常有大量的"<"和"& ...
- C# 基础知识系列- 3 集合数组
简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...
- C# 基础知识系列-13 常见类库(三)
0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...
- C# 基础知识系列- 14 IO篇 文件的操作 (3)
本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性. 上文提到,在<C# 基础知识系列-IO篇>之文件相关的内容完结之后,会带领大家开发一个 ...
- C# 基础知识系列- 14 IO篇 流的使用
0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...
随机推荐
- Jenkins下构建UI自动化之初体验
一.缘 起 笔者之前一直在Windows环境下编写UI自动化测试脚本,近日在看<京东系统质量保障技术实战>一书中,萌生出在jenkins下构建UI自动化测试的想法 二.思 路 首先,在Li ...
- EF Core-1
带着问题去思考,大家好! 前几天了解到EF Core的开发模式:DB First(数据库优先),Model First(模式优先),Code First(代码优先). 我所接触的大多是DB First ...
- Linux下Tomcat优化
/etc/profileexport JAVA_OPTS="-server -showversion -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:Ma ...
- Vue-Cli4笔记
Vue-Cli4与Vue-Cli2区别浅谈 当时学习 Vue-Cli 的时候看的是 Vue-Cli2 的相关教程,当把 package.json 上传 github 的时候提醒有安全问题,于是准备使用 ...
- 全国职业技能大赛信息安全管理与评估-第三阶段-弱口令自动爆破+读取Flag脚本
自动爆破SSH弱口令+读取Flag #coding=utf-8 import paramiko sshc = paramiko.SSHClient() sshc.set_missing_host_ke ...
- Java的集合框架综述
集合 用于存储和管理数据的实体被称为数据结构(data structure).数据结构可用于实现具有不同特性的集合对象,这里所说的集合对象可以看作一类用于存储数据的特殊对象. 集合内部可以采用某种数据 ...
- 北邮OJ 89. 统计时间间隔 java版
89. 统计时间间隔 时间限制 1000 ms 内存限制 65536 KB 题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别 ...
- Vmware15.5安装与许可教程
最近Windows总是提醒我1803版本的服务即将过期,劝我升级到最新版.可我在自动安装的过程中却总是安装失败.于是官网下载了更新助手.检测到的问题是升级过程和 Vmware 软件冲突,于是卸载了 V ...
- Web 服务器压力测试实例详解
发表于 2012-1-6 14:53 | 来自 51CTO网页 Web 服务器搭建完成上线在即,其能够承载多大的访问量,响应速度.容错能力等性能指标,所有这些是管理人员最想知道也最为担心的.如何才能 ...
- 给社团同学做的R语言爬虫分享
大家好,给大家做一个关于R语言爬虫的分享,很荣幸也有些惭愧,因为我是一个编程菜鸟,社团里有很多优秀的同学经验比我要丰富的多,这次分享是很初级的,适用于没有接触过爬虫且有一些编程基础的同学,内容主要有以 ...