回答:
他の人が言ったように、IndexOfAnyを使用します。ただし、次のように使用します。
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
そうすれば、呼び出しごとに新しい配列を作成することにはなりません。文字列は、一連の文字リテラルIMOよりもスキャンが簡単です。
もちろん、これを1回だけ使用するので、無駄な作成が問題にならない場合は、次のいずれかを使用できます。
private const string Punctuation = "*&#...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
または
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}
それは、どれがより読みやすくなるか、句読点文字を他の場所で使用するかどうか、およびメソッドが呼び出される頻度に依存します。
編集:これは、文字列に文字が1つだけ含まれているかどうかを調べるためのリードコプシーの方法の代替方法です。
private static readonly HashSet<char> Punctuation = new HashSet<char>("*&#...");
public static bool ContainsOnePunctuationMark(string text)
{
bool seenOne = false;
foreach (char c in text)
{
// TODO: Experiment to see whether HashSet is really faster than
// Array.Contains. If all the punctuation is ASCII, there are other
// alternatives...
if (Punctuation.Contains(c))
{
if (seenOne)
{
return false; // This is the second punctuation character
}
seenOne = true;
}
}
return seenOne;
}
ToCharArray
もちろん、必要に応じて「インライン」の形式を使用できます。
文字が含まれているかどうかを確認するだけの場合は、他の場所で提案されているように、string.IndexOfAnyを使用することをお勧めします。
文字列に10文字のうち1文字だけが含まれていることを確認したい場合は、少し複雑になります。交差点をチェックしてから重複をチェックするのが最も速い方法だと思います。
private static char[] characters = new char [] { '*','&',... };
public static bool ContainsOneCharacter(string text)
{
var intersection = text.Intersect(characters).ToList();
if( intersection.Count != 1)
return false; // Make sure there is only one character in the text
// Get a count of all of the one found character
if (1 == text.Count(t => t == intersection[0]) )
return true;
return false;
}
String.IndexOfAny(Char[])
こちらがマイクロソフトのドキュメントです。
あなた方全員に感謝します!(そして主にジョン!):これにより私はこれを書くことができました:
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
特定の文字列が実際に「価格が低すぎて表示できない」などの価格または文であるかどうかを検出する良い方法を探していたので。