字符串中字符的出现次数

dot*_*ner 95 c# regex linq

我试图获取某个字符的出现次数,如&下面的字符串.

string test = "key1=value1&key2=value2&key3=value3";
Run Code Online (Sandbox Code Playgroud)

如何确定上述测试字符串变量中有2个和号(&)?

Mic*_*ick 214

你可以这样做:

int count = test.Split('&').Length - 1;
Run Code Online (Sandbox Code Playgroud)

或者使用LINQ:

test.Count(x => x == '&');
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果字符串很大,第一种方法可能会非常昂贵.最糟糕的情况是,如果字符串很大并且(几乎)完全由重复的分隔符(&)组成,由于.Net中的对象开销,它可能会分配字符串原始大小的12-24倍.我会选择第二种方法,如果那还不够快,那就写一个for循环. (9认同)

gdo*_*ica 25

因为LINQ可以做所有事情......:

string test = "key1=value1&key2=value2&key3=value3";
var count = test.Where(x => x == '&').Count();
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,可以使用Count带谓词的重载:

var count = test.Count(x => x == '&');
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 12

最直接,最有效的方法是简单地遍历字符串中的字符:

int cnt = 0;
foreach (char c in test) {
  if (c == '&') cnt++;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用Linq扩展来创建更简单,几乎同样有效的版本.有更多的开销,但它仍然令人惊讶地接近性能循环:

int cnt = test.Count(c => c == '&');
Run Code Online (Sandbox Code Playgroud)

然后有一个老Replace技巧,但是更适合于循环很笨(SQL)或慢(VBScript)的语言:

int cnt = test.Length - test.Replace("&", "").Length;
Run Code Online (Sandbox Code Playgroud)

  • @PawelCioch:你的性能测试一定有问题.`Replace`,`Split`或`IndexOf`不能比遍历字符串和检查每个字符更快,因为这正是他们正在做的事情,只会增加额外的开销. (3认同)

Bri*_*sen 9

为什么要使用正则表达式.String实现IEnumerable<char>,所以你可以使用LINQ.

test.Count(c => c == '&')
Run Code Online (Sandbox Code Playgroud)


pay*_*ayo 8

您的字符串示例看起来像GET的查询字符串部分.如果是这样,请注意HttpContext对您有所帮助

int numberOfArgs = HttpContext.Current.QueryString.Count;
Run Code Online (Sandbox Code Playgroud)

有关使用QueryString可以执行的操作的更多信息,请参阅NameValueCollection


L.B*_*L.B 6

这是在所有答案中获得计数的最低效方法.但是你会得到一个包含键值对的词典作为奖励.

string test = "key1=value1&key2=value2&key3=value3";

var keyValues = Regex.Matches(test, @"([\w\d]+)=([\w\d]+)[&$]*")
                     .Cast<Match>()
                     .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);

var count = keyValues.Count - 1;
Run Code Online (Sandbox Code Playgroud)

  • 哈哈,"效率最低的方式",喜欢它! (9认同)