我试图在以下字符串中获取某个字符的出现次数,例如&
。
string test = "key1=value1&key2=value2&key3=value3";
如何确定上述测试字符串变量中有2个和号(&)?
答案 0 :(得分:207)
你可以这样做:
int count = test.Split('&').Length - 1;
或者使用LINQ:
test.Count(x => x == '&');
答案 1 :(得分:24)
因为LINQ
可以做所有事情......:
string test = "key1=value1&key2=value2&key3=value3";
var count = test.Where(x => x == '&').Count();
或者,如果您愿意,可以使用带谓词的Count
重载:
var count = test.Count(x => x == '&');
答案 2 :(得分:12)
最直接,最有效的方法是简单地遍历字符串中的字符:
int cnt = 0;
foreach (char c in test) {
if (c == '&') cnt++;
}
您可以使用Linq扩展来制作更简单,几乎同样有效的版本。有更多的开销,但它仍然令人惊讶地接近性能循环:
int cnt = test.Count(c => c == '&');
然后有旧的Replace
技巧,但是这更适合于循环很笨(SQL)或慢(VBScript)的语言:
int cnt = test.Length - test.Replace("&", "").Length;
答案 3 :(得分:9)
为什么要使用正则表达式。 String
实现IEnumerable<char>
,因此您可以使用LINQ。
test.Count(c => c == '&')
答案 4 :(得分:8)
您的字符串示例看起来像GET的查询字符串部分。如果是这样,请注意HttpContext为您提供了一些帮助
int numberOfArgs = HttpContext.Current.QueryString.Count;
有关QueryString的更多信息,请参阅NameValueCollection
答案 5 :(得分: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;