デイブビッシュの答えは良く、正しく機能します。
に置き換えるCast<Match>()
と処理OfType<Match>()
速度が向上しますが、注目に値します。
コードは次のようになります。
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
結果はまったく同じです(そしてOPの問題にまったく同じ方法で対処します)が、巨大な文字列の場合はより高速です。
テストコード:
static void Test()
{
Stopwatch sw = new Stopwatch();
StringBuilder sb = new StringBuilder();
string strText = "this will become a very long string after my code has done appending it to the stringbuilder ";
Enumerable.Range(1, 100000).ToList().ForEach(i => sb.Append(strText));
strText = sb.ToString();
sw.Start();
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
sw.Stop();
Console.WriteLine("OfType: " + sw.ElapsedMilliseconds.ToString());
sw.Reset();
sw.Start();
var arr2 = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.Cast<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
sw.Stop();
Console.WriteLine("Cast: " + sw.ElapsedMilliseconds.ToString());
}
出力は次のとおりです。
OfType: 6540
Cast: 8743
以下のために非常に長い文字列のキャスト()ので遅いです。
OfType<Match>()
代わりにこれを使用したでしょうCast<Match>()
...そしてまた、結果は同じでしょう。