답변:
다른 사람들이 말했듯이 IndexOfAny를 사용하십시오. 그러나 다음과 같이 사용합니다.
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
이렇게하면 호출 할 때마다 새 어레이를 만들지 않아도됩니다. 문자열은 일련의 문자 리터럴 인 IMO보다 스캔하기가 더 쉽습니다.
물론 이것을 한 번만 사용할 것이므로 낭비되는 생성이 문제가되지 않는다면 다음 중 하나를 사용할 수 있습니다.
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;
}
어떤 것이 더 읽기 쉬운 지, 다른 곳에서 구두점 문자를 사용할지 여부 및 메서드가 호출되는 빈도에 따라 다릅니다.
편집 : 문자열에 정확히 하나 의 문자 가 포함되어 있는지 확인하는 Reed Copsey의 방법에 대한 대안이 있습니다 .
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 개의 문자 중 정확히 하나만 포함되어 있는지 확인 하려면 조금 더 복잡해집니다. 가장 빠른 방법은 교차로를 확인한 다음 중복을 확인하는 것입니다.
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[])
다음은 Microsoft의 문서 입니다.
여러분 모두 감사합니다! (그리고 주로 Jon!) :이를 통해 다음과 같이 작성할 수있었습니다.
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
특정 문자열이 실제로 가격인지 또는 '표시하기에 너무 낮음'과 같은 문장인지 감지하는 좋은 방법을 찾고있었습니다.