102

我正在尝试获取某个字符的出现次数,例如&在以下字符串中。

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

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

4

6 回答 6

224

你可以这样做:

int count = test.Split('&').Length - 1;

或者使用 LINQ:

test.Count(x => x == '&');
于 2012-04-30T22:41:49.283 回答
26

因为LINQ什么都能做……:

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

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

var count = test.Count(x => x == '&');
于 2012-04-30T22:41:39.377 回答
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;
于 2012-04-30T22:48:20.917 回答
9

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

test.Count(c => c == '&')
于 2012-04-30T22:41:13.930 回答
8

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

int numberOfArgs = HttpContext.Current.QueryString.Count;

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

于 2012-04-30T22:51:36.357 回答
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;
于 2012-04-30T23:02:34.703 回答