问题描述
在.NET/C#的应用程序开发中,需要从字符串中找出某个字符出现的次数,如下字符串:
string source = "/once/upon/a/time/";
现要找出source
字符串中斜线/
出现的次数,应该如何处理,有哪些方式可以实现,哪种更高效呢?
方案一
使用字符串的IndexOf()
方法,如下:
string source = "/once/upon/a/time/";
int count = 0;
int n = 0;
while ((n = source.IndexOf('/', n)) != -1)
{
n++;
count++;
}
或者,将字符串转换成字符数组,然后使用foreach循环字符数组中的每个字符,如下:
char[] testchars = source.ToCharArray();
foreach (char c in testchars)
{
if (c == '/')
count++;
}
或者,将字符串转换成字符数组,然后使用for循环字符数组中的每个字符,如下:
char[] testchars = source.ToCharArray();
int length = testchars.Length;
for (int n = 0; n < length; n++)
{
if (testchars[n] == '/')
count++;
}
如果从字符数组的末尾向开始进行循环遍历,则执行效率会更高,如下:
int length = testchars.Length;
for (int n = length-1; n >= 0; n--)
{
if (testchars[n] == '/')
count++;
}
此方案中的只种实现均比以下几个方案的实现更高效。
方案二
如果是.NET 3.5及以上版本,可以使用LINQ
快速实现,如下:
int count = source.Count(f => f == '/');
或者,如果不想使用LINQ
,那么还可以使用字符串的Split()
方法,如下:
int count = source.Split('/').Length - 1;
方案三
使用正则表达式实现,如下:
int count = new Regex(Regex.Escape(needle)).Matches(haystack).Count;
方案四
如果需要实现不仅可以查找单个字符,还可以查找一个子字符串,则可以使用如下方式:
int count = src.Select((c, i) => src.Substring(i)).Count(sub => sub.StartsWith(target))
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册