web-dev-qa-db-ja.com

文字列内の文字の出現回数

次の文字列で&などの特定の文字の出現回数を取得しようとしています。

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

上記のテスト文字列変数に2つのアンパサンド(&)があることを確認するにはどうすればよいですか?

90

これを行うことができます:

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

またはLINQの場合:

test.Count(x => x == '&');
209

LINQはすべてを実行できるため...:

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

または、必要に応じて、述語を取るCountオーバーロードを使用できます。

var count = test.Count(x => x == '&');
25
gdoron

最も簡単で効率的な方法は、文字列内の文字を単純にループすることです。

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;
12
Guffa

そのために正規表現を使用する理由。 StringIEnumerable<char>を実装しているため、LINQを使用できます。

test.Count(c => c == '&')
9
Brian Rasmussen

文字列の例は、GETのクエリ文字列部分のように見えます。もしそうなら、HttpContextがいくつかの助けを持っていることに注意してください

int numberOfArgs = HttpContext.Current.QueryString.Count;

QueryStringでできることの詳細については、 NameValueCollection を参照してください

8
payo

すべての回答でカウントを取得する最も非効率的な方法を次に示します。ただし、ボーナスとしてキーと値のペアを含む辞書を取得します。

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;
6
L.B