次の文字列で&
などの特定の文字の出現回数を取得しようとしています。
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;