天天看点

字符串

字符串是直接从 object 继承的密封类类型。不可以被继承,表示 unicode 字符串。

前面我们还了解了可以使用@表示禁止转义。

字符串常用属性

length

返回字符串长度

chars

指定字符位置的字符

字符串常用方法

indexof

indexofany

lastindexof

lastindexofany

字符的索引

insert

指定索引位置插入一个指定的 string 实例

remove

从此实例中的指定位置开始删除指定数目的字符

padleft

padright

使用空格或指定的字符填充

replace

使用新的字符替换原有的字符

split

按指定的分隔符将字符串转为数组

substring

查询子串

tochararray

将字符串转为字符数组

tolower

toupper

大小写转换

isnullorempty

是空还是非空字符串

trim

trimend

trimstart

去除空格或指定字符

string的本质是char的数组描述形式,可以通过以下的代码来证实

1

字符串

string s = "hello c#";

2

字符串

3

字符串

foreach (char c in s)//string中的每个元素都是char

4

字符串
字符串
字符串

{

5

字符串

system.console.writeline(c);

6

字符串

}

7

字符串

8

字符串

for (int i = 0; i <= s.length - 1;i++ )//string就是一个char数组

9

字符串
字符串
字符串

10

字符串

system.console.writeline(s[i]);

11

字符串

很多同学对indexof这个方法总感觉莫名其妙,不知道indexof有什么用。indexof有很多地方可以使用。

现看一下indexof的表现

字符串
字符串
字符串

//仅仅是查找的方向不一样,字符的位置总是从0开始计算

字符串

system.console.writeline(s.indexof('l'));//2,第3个字符,从前面数第一个l

字符串

system.console.writeline(s.lastindexof('l'));//3,第4个字符,从后面数第一个l

那indexof和lastindexof有什么具体的作用呢?

字符串

string s = "-12.23";

字符串
字符串

if(s.indexof('.')!=s.lastindexof('.'))

字符串
字符串
字符串
字符串

system.console.writeline("小数点不止一个,错误");

字符串
字符串
字符串
字符串

if(s.lastindexof('-')>0)

字符串
字符串
字符串
字符串

system.console.writeline("符号不止一个或符号不在第一位,错误");

12

字符串

13

字符串

14

字符串

15

字符串

if (s.lastindexof('.') - s.lastindexof('-')==1)

16

字符串
字符串
字符串

17

字符串

system.console.writeline("小数点在符号直接后面,错误");

18

字符串

其实indexof和lastindexof的处理大致如下

字符串

string s = "hello";

字符串
字符串

//indexof

字符串

for (int i = 0; i <= s.length - 1;i++ )

字符串
字符串
字符串
字符串

if(s[i]=='l')

字符串
字符串
字符串
字符串

system.console.writeline("indexof={0}",i);

字符串

break;

字符串
字符串
字符串
字符串

//lastindexof

字符串

for (int i = s.length-1; i >=0; i--)

字符串
字符串
字符串
字符串

if (s[i] == 'l')

字符串
字符串
字符串
字符串

system.console.writeline("lastindexof={0}", i);

19

字符串

20

字符串

21

字符串

我们来个练习巩固一下

声明一个字符串,且赋值” 我们使用microsoft visual studio .net 2005 c#开发新一代的应用程序”。

输出 英文字符的个数

输出 标点符号的个数

输出 剩余其他字符的个数

字符串

char[] c = "我们使用microsoft visual studio .net 2003 c#开发新一代的应用程序".tochararray();

字符串

string letter = "abcdefghijklmnopqrstuvwxyz";

字符串

letter += letter.tolower();

字符串

string punctuation = @"~!@#$%^&*()_+|`-=/[]{};':<>?,./";

字符串

int li = 0;//英文字符个数

字符串

int pi = 0;//标点符号个数

字符串

int ci = 0;//其他字符个数

字符串

for (int i = 0; i <= c.length - 1; i++)

字符串
字符串
字符串
字符串

if (letter.indexof(c[i]) >= 0)

字符串
字符串
字符串
字符串

li++;

字符串
字符串

else

字符串
字符串
字符串
字符串

if (punctuation.indexof(c[i]) >= 0)

字符串
字符串
字符串
字符串

pi++;

字符串
字符串
字符串
字符串
字符串

22

字符串

ci++;

23

字符串

24

字符串

25

字符串

26

字符串

system.console.writeline("总字符个数:{0}", c.length);

27

字符串

system.console.writeline("英文字符个数:{0}标点符号个数:{1}其他字符个数:{2}合计:{3}",

28

字符串

li, pi, ci, li + pi + ci);

当然,我们可以用char的静态方法来优化上面的代码

字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串

if (char.isupper(c[i]) || char.islower(c[i]))

字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串

if (char.ispunctuation(c[i]))

字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串
字符串

ci++; ;

字符串
字符串
字符串
字符串

system.console.writeline("{0}--{1},{2},{3}:{4}", li + pi + ci, li, pi, ci, c.length);

spilt是非常有用的方法

字符串

string dir = @"c:/windows/microsoft.net/framework/v2.0.50727/applaunch.exe";

字符串
字符串
字符串

//不使用split的繁琐代码

字符串
字符串

int star = 0;

字符串

int end = dir.indexof('//', star);

字符串
字符串

do

字符串
字符串
字符串
字符串

system.console.writeline(dir.substring(star, end - star));

字符串

star = end + 1;

字符串

end = dir.indexof('//', star);

字符串

} while (end > -1);

字符串

system.console.writeline(dir.substring(star));

字符串
字符串
字符串

//不使用split的优雅代码

字符串

string[] dirs = dir.split('//');

字符串

foreach (string d in dirs)

字符串
字符串
字符串
字符串

system.console.writeline(d);

字符串
字符串
字符串

//直接定位文件

字符串

system.console.writeline(dir.split('//')[dir.split('//').length - 1]);