上一篇文章介绍了字符串自身的一些方法,就是对象方法。在字符串体系中,还有一些是string
类提供的静态方法。这两部分构成了字符串体系,固然还有一些三方库为字符串提供了扩展方法。
这里简单的介绍一下string
类的静态方法。c#
经过调用string.Create
方法能够生成一个字符串。该方法的声明是spa
public static string Create<TState> (int length, TState state, System.Buffers.SpanAction<char,TState> action);
简单的来说就是生成一个长度为length
的字符串,基本元素是 TState
类型的state
,具体的填充过程交由action
来进行处理。值得注意的是action是一个委托,也就是它能够用lambda表达式直接使用,具体声明以下:code
public delegate void SpanAction<T,in TArg>(Span<T> span, TArg arg);
由于方法中指定了Span
参数为char
,那么 action 的写法应该以下:对象
(span, state)=>//span 的类型是 Span<char>,state的类型是 TState { // 注意,没有返回值 }
示例:blog
string str = "12320kz,zxcqweqwkuqwiqewpqwwe"; Console.WriteLine(string.Create(10,str, (span, c) => { span.Fill(c[0]); }));
span
的方法Fill
的参数是char
,因此这个方法就是按照必定逻辑将 state参数转换成char而后填充给字符串,在action中屡次调用Fill只会生效最后一次填充。排序
字符串的链接有两个方法,一个是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
由于字符串机制的问题,因此通常字符串的相等性比较分为了两种,字面相等性和引用相等性。在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);
该方法返回两个字符串是不是相等的,也就是与字符串默认的==
判断是一致的。
在咱们开发的过程当中常常会遇到对字符串进行排序的需求,那么字符串排序的逻辑是什么呢?
对于数字、字母来讲是按照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
能够明显看出,排序规则基本就是字典顺序。
补充三个上一篇文章遗漏的方法,插入、删除、获取一个子串。
public string Insert (int startIndex, string value);
在源字符串指定的位置插入一个字符串并返回插入的结果。
//从startIndex开始,后面的全部元素都删除,包括startIndex,返回剩下的字符 public string Remove (int startIndex); //从startIndex开始,删除 count个元素,返回剩下的字符 public string Remove (int startIndex, int count);
// 返回从startIndex开始,剩下的的元素,包括startIndex public string Substring (int startIndex); // 返回从startIndex开始,一共count个元素的字符串,包括startIndex public string Substring (int startIndex, int length);
这一部分的方法比较简单,就不作示例演示了。不过须要注意的是 全部参数都应该是大于0的,且不能大于字符串的长度,包括 startIndex+count。
目前为止,字符串的常规使用已经完成了,可是字符串的使用却并无结束,后续会继续介绍C#其余内容,其中有几个内容是与字符串有很大的关联的,这里先容我卖个关子。
更多内容烦请关注个人博客