次の文字列のように、特定の文字の出現回数を取得しようとして&
います。
string test = "key1=value1&key2=value2&key3=value3";
上記のテスト文字列変数に2アンパサンド(&)があることを確認するにはどうすればよいですか?
あなたはこれを行うことができます:
int count = test.Split('&').Length - 1;
またはLINQを使用する場合:
test.Count(x => x == '&');
すべてを行うことができるのでLINQ
...:
string test = "key1=value1&key2=value2&key3=value3";
var count = test.Where(x => x == '&').Count();
Count
または、必要に応じて、述語をとるオーバーロードを使用できます。
var count = test.Count(x => x == '&');
最も簡単で最も効率的なのは、文字列内の文字を単純にループすることです。
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;
そのために正規表現を使用する理由。String
を実装IEnumerable<char>
しているので、LINQを使用できます。
test.Count(c => c == '&')
文字列の例は、GETのクエリ文字列部分のように見えます。もしそうなら、HttpContextがあなたのためにいくつかの助けを持っていることに注意してください
int numberOfArgs = HttpContext.Current.QueryString.Count;
QueryStringでできることの詳細については、NameValueCollectionを参照してください。
これが、すべての回答でカウントを取得するための最も非効率的な方法です。ただし、ボーナスとしてキーと値のペアを含む辞書を取得します。
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;